ユーザの実行権限を柔軟に割り当てるsudoのリスクとメリット

 セキュリティ関連のジョブにいささかでも関わりを有す者であれば、root権限ないしrootパスワードを一般ユーザに与えるのは御法度であると心得ているはずだ。しかしながら、正当な理由をもってroot権限下での処理を実行する必要に迫られた一般ユーザが出てきた場合はどうすればいいのだろうか? そうした問題には非常にシンプルな解答が存在する。sudoを使えば、rootパスワードを公開することなくアクセス範囲を最小限化した上で必要な権限を一般ユーザに与えることができるのである。

 sudo(superuser doの略)とは、管理権限を制限付きで他のユーザに与えるためのプログラムで、実際これで許可される権限では事前の指定範囲内のコマンドしか行えないようになっている。またsudoで行われる操作はすべてオーディットトレール(追跡記録)に残されるので、仮にこうしたユーザが何らかの方法で権限外の処理を行ったとしても、システム管理者がログ記録を確認すれば問題点の特定と修正が行えるはずだ。その他にsudo設定を介して複数のホストに与える権限を中央管理するという使い方も可能である。

 sudoのインストールおよびホストの設定が完了すると、指定されたユーザは「sudo aForbiddenCommand 」という構文を用いることで、新たに許可された範囲のコマンドを実行できるようになる。sudoの実行にはroot用とは別のパスワード入力が必要とされているが、これは端末から目を離した隙に第三者が不正使用することを防止するための措置である。またsudoにより本来の権限を越えた操作を許されたユーザであっても、各自の欲しいままにシステムを自由に操作できるという訳ではなく、あくまでシステム管理者がsudo設定で許可した範囲内でしかコマンドを実行できないため、システムがダメージを受けるリスクは最小限化できると見ていいだろう。

インストールと設定

 sudoは決して最近登場したものではなく、その初期バージョンは1980年代にBSDで使われていたものであり、その後かなりの頻度にてアップデートを受け続けてきたという長い歴史を有している。もっともディストリビューションによっては標準で装備されていないケースもあるが、通常はリポジトリからインストールすればいいはずだ。

 sudoはフリーソフトウェア形態で提供されており、その配布にはInternet Systems Consortium(ISC)スタイルのライセンスが適用されている。現状で入手できるのは安定版(本稿執筆時点では1月20日リリースの1.6.9p12)および開発版(バージョン1.7b1)の2種類である。sudoの実行はシステムセキュリティに関係してくるため、選択肢としては前者を使用すべきだろう。またソースからのインストールをする場合、ソースコードの配布はGratiSoftのWebサイトにて行われている。インストール手順そのものに難しい点はなく、ごく一般的なconfigure、make、make installのコマンド処理にて実行できる。なおsudoの動作設定としては、ユーザがパスワード入力を間違えた場合に侮蔑用のメッセージであざ笑うという設定を施しておくこともできるので、その辺に興味のあるシステム管理者がおられたら、どのような設定オプションが利用可能かを調べておいても損はしないだろう。

 sudoの設定で使用する/etc/sudoersは、そのファイル名が示すとおりにsudoの使用を許可するユーザを登録しておくためのものである。このファイル自体のアクセス設定は“400”とされており、読み取りはroot権限しか行えず書き込みは全ユーザができないようになっている。そのため同ファイルの編集にはvisudoというプログラムが必要であり、このプログラムはパーミッション関係の処理を行えるほか、複数ユーザの同時操作を防止する編集ファイルのロックおよび、保存時における設定ミスのチェック機構が装備されている。visudoの実行にはEDITOR環境変数に指定する任意のエディタを使用するようになっているが、通常はviを指定しておけばいいはずだ。

 sudoersファイルの構成は単純で、先頭が4種類のオプションセクションで始まり、末尾が個々の使用権限の設定部というフォーマットとなっている。ファイル中には空白行が混在していてもよく、#記号で始まる行はコメント文と見なされる。まず先頭のオプションセクションではそれぞれ下記の指定が行える。

  • Userエイリアス:単一ユーザ(実際の用途はそれほど広くない)または複数ユーザに対するエイリアスを設定する。1つのユーザを複数のエイリアスに登録することも可能
  • Run Asエイリアス:sudoユーザにどのユーザ(複数指定可)の権限を与えるかの指定。デフォルト設定下のsudoではroot権限が与えられてしまうので、通常はここに適切なユーザを指定しておく
  • Hostエイリアス:権限の適用先ホストを指定する。複数のLinuxマシンを一括で管理するジョブをこなすという場合以外、使う機会はほとんどない。またその際には他のホストとの間で本ファイルの同期を取るか、Network Information Service(NIS)などを介したファイルアクセスを確保しておく必要がある
  • Commandエイリアス:特定コマンドにアクセスするための別名を定義する。例えば/usr/sbin/apt-getなどの絶対パスを必要とするコマンドをAPTと入力するだけで指定可能にできる

 これらのエイリアス指定は必須ではないが、将来的な設定作業を簡単化するのに役立てることができる。例えばdonald_duckなるユーザにmickey_mouseなるユーザと同等の権利を与えるように後から変更する場合、後者が属する既存のグループが作ってあればそこに前者を追加するだけで済み、個々の設定行を1つずつコピーする場合よりも大幅に手間が省けるはずである。またALLという特殊なエイリアスが用意されており、これは全ユーザや全ホストなどの意味で使える。

 次に設定するのは実行権限の指定セクションで、この部分は“who where = (whoelse) what”という構文により「whoという者(ユーザ、グループ、ユーザエイリアス)はwhereというホスト上にてwhatというコマンドをwhoelseというユーザの有す権限で実行できる」という指定を行っていけばいい(この説明だけでは分かりにくいかもしれないので設定ファイルのサンプルを用意した)。ここでは、例えばsudoをパスワードなしで実行可能にするNOPASSWDなど、いくつかのオプション指定をすることも可能だが、詳細はマニュアルを参照して頂きたい。

 なお本稿で掲載したサンプルは、設定ファイルおよび各種オプションがどのような形式で記述されるかの概要を示すためのもので、使用可能なすべての設定を網羅したものとはなっていない(実際にどのような設定が可能であるかは「man sudoers」にて確認のこと)。

#
# ディズニーのキャラクタ名を拝借したサンプル/etc/sudoersファイル
#

# ユーザエイリアス
# 1行目では特定の3ユーザを一括して参照するエイリアスを設定
# 2行目ではdonaldを除いたducksユーザグループのエイリアスを設定
# 3行目では単一ユーザのみのエイリアスを設定しているが、これは将来の便を図っての措置
#
User_Alias	NEPHEWS = huey, dewey, louie
User_Alias	ALL_DUCKS_BUT_DONALD = %ducks, !donald
User_Alias	MICKEY = mickey_mouse

# コマンドエイリアス

Cmnd_Alias      HALT_OR_REBOOT = /sbin/halt
Cmnd_Alias      KILL = /usr/bin/killall
Cmnd_Alias      SHUTDOWN = /sbin/shutdown
Cmnd_Alias      SU = /bin/su


# 権利設定:誰が何を実行できるか

# 標準の設定ルール:rootおよびwheelグループユーザにはフルアクセスを許可
root            ALL = (ALL) ALL
%wheel          ALL = (ALL) ALL

# ここではmickeyがシステム管理者であるとして、全権限をパスワード不要で与える
MICKEY		ALL = NOPASSWD: ALL


# NEPHEWSにはコンピュータの停止系コマンドを許可
NEPHEWS		HALT_OR_REBOOT, SHUTDOWN

 設定ファイルの末尾には追加設定の指定行を記述しておくことも可能で、具体的には次のような指定が行える。

  • 間違ったパスワード入力やsudoの不正使用が試みられた場合に電子メールで通知するか
  • ログイン失敗時の強制終了を猶予する上限回数
  • sudoの使用に伴うリスクの説明をユーザに提示するか
  • sudoを介して使用された全コマンドを記録させる専用のログファイル

 エディタの終了時にはvisudoによって設定内容のエラーがチェックされるようになっているので、問題点を指摘された場合は該当箇所を設定し直せばいいが、あるいはすべての変更を取り消して編集前の状態に設定ファイルを復帰させることもできる。なお、エラー部分を残したままファイルを保存しておくという第三の選択肢も取れなくはないが、その場合は問題箇所が訂正されるまで全ユーザがsudoコマンドを使用不可能な状態に置かれるので、可能な限り避けるべきである。

使用上の注意

 こうしたsudoの設定について注意すべき点は、想定の範囲外の権限を与えないようにすることである。当然ながらsuの実行を許してしまうと、実質的にそのユーザにroot権限を与えたのと同じになってしまう。ある意味こうしたものは明白な設定ミスと見なせなくもないが、それよりもやっかいなのは、ある程度の経験を積まないと気づきにくい形で微妙な罠が隠されていることだ。例えば「sudo less」を実行できるユーザが!コマンドを使うと、その他のコマンドをroot権限で実行可能となってしまう場合がある(何故こうしたリスクが生じるかがピンと来ない読者は、lessのmanページにあるこの問題の解説を参照して頂きたい)。いずれにせよコマンドへのアクセス設定に関しては“転ばぬ先のつえ”的な姿勢で対処するのが肝要であり、SANS Instituteなどのセキュリティ問題を扱ったサイトを参考にして、この種のリスクにおいてどのような脆弱性や手口が確認されているかをチェックしておくべきである。

 その他に犯しやすい単純なミスとしてはコマンドを相対パスで指定するというものがあり、ある程度の知識を有すユーザであれば、これを糸口にしてすべての権限を取得されかねない。例えばFOOというエイリアスにbin/fooと設定したとしよう。その状況下においてあるユーザが適当な場所にbinディレクトリを作成して、その中に自分が実行したいコマンドを格納しておくと(ここでの重要なポイントはその名称をfooとしておくこと)、これをroot権限下で実行することであらゆる操作が行えるようになってしまう。

 残念ながら、一般のユーザがいわゆる特権昇格(privilege escalation)を行う手口を見つけて不正にroot権限を取得してしまうような事態はあり得ないと保証することはできないのだが、特定ユーザにのみ上位のアクセス権限を必要とする一部の操作だけを許可するという処理を簡単に実行できる現実的な手法は、sudoの他に存在していないのである。

 このようにsudoの使用にはある程度のリスクが伴いはするものの(その大部分は設定時のミスで余分な権限まで与えることに関連している)、指定ユーザに通常以上の権限を与えて特定タスクの実行を許すといった柔軟なシステム運用を可能にしてくれる存在という点には間違いがないのだ。

Federico Kerekiはウルグアイ出身のシステムエンジニアで、20年以上に渡るシステム開発、コンサルティング、大学講師の経験を有している。

Linux.com 原文