WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

一般ユーザでもroot権限が必要なコマンドを実行できるようにする – sudo

      2012/11/26

sudoの設定

sudoは一時的に別ユーザとしてコマンドを実行するためのものです。
sudoコマンドはhaltやreboot、デーモンの起動などといった通常root権限を持っていないと実行できないコマンドを一般ユーザで実行するケースでよく利用されます。

sudoを利用するユーザを追加

sudoは、 /etc/sudoers ファイルを編集することで利用可能となります。
例えば、 cent というユーザが sudo を実行できるようにするには以下の書式の行を設定ファイルに追記します。

# echo 'cent ALL=(ALL) ALL' >> /etc/sudoers
- または、viを利用して直接記述 -
# vi /etc/sudoers
cent ALL=(ALL) ALL

追記した箇所は

ユーザ名 ホスト = (権限) コマンド

という書式になっています。

ユーザ名 sudo を利用できるようにするユーザ名を指定
グループを指定する場合は % を先頭につける
ホスト ホストに対する許可( /etc/sudoers にホストに対するエイリアスを書かない限りALL にしておけばいいようです。)
(権限) sudo されるユーザ名 (ALL ならば全てのユーザ権限, つまりルート権限を使うことができる)
省略可。省略した場合はroot
コマンド 利用できるコマンドの制限 (ALL なら権限で指定したユーザの使える全てのコマンドを利用できる)
/sbin/ とすれば /sbin/以下のコマンド。/sbin/shutdown とすれば shutdown コマンドを指定することができる

※2010/06/8/追記
YTさんからいただいたコメントでご指摘いただきましたとおり、「sudoersファイルの編集はviのような一般のエディタではなく、visudoコマンドで行うことが推奨されている」ようです。
早速visudoコマンドのマニュアルを読んで見たところ、以下のような記述がありました。

visudo は、vipw(8) と同じような安全な方法で sudoers ファイルを編集する。 visudo は複数同時の編集に対して sudoers ファ
イルをロックし、
基本的な文法エラーやパースエラーをチェックしてくれる。 sudoers ファイルが現在すでに編集中であった場合、 “try again la
ter” というメッセージが出される

visudo は、編集後 sudoers ファイルをパースし、 文法エラーがあった場合は変更を保存しない。 エラーが見つかると、visudo
はそれが起こった 行番号を示すメッセージが表示し、 “What now?”
というプロンプトを出す。

このあたりの堅牢さがvisudoを使用すべき理由ですかね?
下記はvisudoの実行例です。

# visudo
cent ALL=(ALL) ALL

sudo実行時のパスワードの設定

デフォルトでは、sudoでコマンドを実行したときに入力を求められるパスワードは、権限を取得したいユーザのパスワードではなく自らのパスワードとなっています。(先述の設定例だと、 root が権限を取得したいユーザだが、求められるのは cent というユーザのパスワード)

$ sudo /etc/init.d/httpd reload
Password:    ←ここで求められるパスワードはデフォルトではsudoを実行したユーザのパスワード

このsudo実行時に求められるパスワードの設定は設定ファイルのDefaultディレクティブに以下のフラグを指定して制御します。

# vi /etc/sudoers
Defaults  rootpw    ※rootのパスワードを要求
Defaults  runaspw,runas_default=user1    ※user1のパスワードを要求
Defaults  targetpw    ※-uオプションで指定されたユーザのパスワードを要求
Defaults  passwd_tries=5    ※パスワードの入力を5回までに設定
rootpw 起動したユーザのパスワードではなく、 root のパスワードを要求する。
このフラグはデフォルトでは off である
runaspw 起動したユーザのパスワードではなく、 runas_default オプションで定義されたユーザ (デフォルトでは root) のパスワードを要求する。
このフラグはデフォルトでは off である。
targetpw 起動したユーザのパスワードではなく、 -u オプションで指定されたユーザ (デフォルトでは root) のパスワードを要求する。
このフラグはデフォルトでは off である。
passwd_tries パスワードを入力できる回数。
デフォルトでは3回まで。

また、パスワードを入力しなくてもコマンドを実行できるようにするにはコマンド指定の前にNOPASSWD:フラグを付加します。

# vi /etc/sudoers
cent ALL=(ALL) NOPASSWD: ALL

sudoコマンドの実行

$ sudo コマンド    ※rootでコマンドを実行
$ sudo -u ユーザ名 コマンド    ※指定されたユーザ名でコマンドを実行
$ sudo -s    ※プロンプトが#に変わり、 exit コマンドを実行するまでroot権限を保持する
  • sudo の設定ファイルは /etc/sudoers
  • sudoersファイルの編集はviのような一般のエディタではなく、visudoコマンドで行うことが推奨されている
  • パスワードの設定は設定ファイル内の Defaults ディレクティブで設定する

 - Linux , ,