サーバーの管理者権限を得るコマンドとして、su
コマンドが用意されていますが、これはログインするたびにroot のパスワードを入力しなくてはならないという点で、ネットワーク上にroot
のパスワードが流れたり、パスワード入力を監視されたり(覗かれたり)するなどの可能性があり、セキュリティ上の観点から多少の不安が残ります。そこで使用するのがsudo(superuser
do) コマンドで、指定した一般ユーザに対して特定のroot コマンドを付与することで代理のroot
ユーザとしてサーバーを管理させる事ができるようになります。自宅サーバーを構築している皆さんであれば最大の魅力は、やっぱりroot
パスワードを何度も入力しなくても済むことでしょうかね…(^_^;)
|
|
■sudo のインストール
sudo はほとんどのLinuxディストリビューションにはデフォルトでインストールされています。以下のコマンドを実行してsudo
がインストールされているかどうかを確認してください。
# rpm -qa | grep
sudo
sudo-1.6.7p5-2 |
|
インストールされていなければyum もしくは、apt-get を利用してインストールしておきましょう。
# yum install sudo
or
# apt-get install sudo |
|
■sudo の基本的な使い方
sudoコマンドは、なにも設定していない状態では一般ユーザはデフォルトで使用できないようになっています。試しにroot
しか閲覧することのできない/var/log/messageをsudo コマンドを実行して見ようとするとパスワードの入力を求められ、どのようなパスワードを入力してもコマンドは以下のように失敗してしまいます。このログインの失敗は、/var/log/message
に書き込まれます。
$ sudo tail /var/log/messages
Password:
Sorry, try again.
kororo is not in the sudoers file. This
incident will be reported. |
|
それでは実際に一般ユーザに対してsudo コマンドが使用できるように設定していきます。設定ファイルは、/etc/sudoers
になりますが、
このファイルを絶対に vi で編集しないようにしてください。このファイルの設定ミスなどをしてしまうと思わぬトラブルを引き起こしかねないので、sudoersファイルのロックや構文チェックを行ってくれる
visudo というコマンドが用意されています。visudo コマンドを実行し、以下のように記述すると一般ユーザに対して全てのroot
権限が与えられます。具体的には、「ユーザーkororoは、すべての接続元(ALL)から、すべてのユー ザー権限(ALL)で、すべてのコマンド(ALL)を実行できる」という意味になります。
# visudo
%kororo ALL=(ALL) ALL //kororo
に全てのroot 権限を与える |
|
※visudo の構文チェック
構文ミスがあると以下のように知らせてくれます。「e」をタイプすれば再編集することが出来ます。
Warning: undeclared
Host_Alias `LOCAL' referenced near line
24
>>> sudoers file: syntax error,
line 23 <<<
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers
file
(Q)uit and save changes to sudoers file
(DANGER!) |
|
編集し終えたら、一般ユーザで再ログインしてからもう一度/var/log/message を見てみましょう。これでファイルが正常に閲覧できるようになります。なお、最初にsudo
を実行した時に限り、パスワードを聞かれますが一定の時間内(デフォルト:5分以内)であれば次のコマンド実行時からはパスワードを聞かれなくなります。この時に入力するパスワードは一般ユーザのパスワードであるため、いくらSSHを使っているとはいえ、ネットワーク上にroot
のパスワードが流れなくなるという点では、セキュリティの強化が図れます。
$ sudo tail /var/log/messages
Password: 現在ログインしているユーザのパスワードを入力 |
|
次にHost_Alias を設けてローカルネットワーク( 192.168.0.0/24)に存在するkororo
のみに全 root 権限を与えるように設定します。また、「NOPASSWD」を用いることでパスワードなしでsudo
を実行することもできます。「LOCAL」は定義名なので自由な名前を付けられますが、英大文字でなければならない等の一定のルールがありますので次項で説明する「エイリアス機能」を参照してください。
# visudo
# Host alias specification
Host_Alias LOCAL = 192.168.0.0/24
//ローカルネットワークに限定する
or
Host_Alias LOCAL = 192.168.0.2 //あるいは、特定のIPアドレスに限定する
# User privilege specification
%kororo LOCAL=(ALL) NOPASSWD:
ALL
|
|
■エイリアス機能
上記でもHost_Alias を使用して実例を見てみましたが、sudoers のエイリアス機能には以下の4種類があります。定義名は、
大文字のA-Z、数字、アンダーバー(_)を使用します。そして先頭文字は必ずA~Zで始まる必要がありますので注意してください。
|
User_Alias |
ユーザー名の別名を定義する
例)User_Alias WEBMASTER = koro, hoge, foo |
|
Runas_Alias |
実行ユーザー名の別名を定義する
例)Runas_Alias OP = root, operator |
|
Host_Alias |
接続元ホストの別名を定義する
例)Host_Alias LOCAL = 192.168.0.0/24
例)Host_Alias INTERNET = 172.16.0.1, 172.16.0.2 |
|
Cmnd_Alias |
実行するコマンドの別名を定義する
例)Cmnd_Alias SHUTDOWN = /sbin/halt, /sbin/shutdown,
\
/sbin/poweroff, /sbin/reboot, /sbin/fastboot,
/sbin/init |
|
実際にエイリアス機能を使用して特定コマンドだけを使用できるようにすることもできます。以下のsudoers
の例では、ファイル削除のrm コマンドだけをkororoユーザに与えていることになります。ここで留意しておきたいのは、rmコマンドだけしか使えなくなるというわけではなく、sudoしてから実行できるコマンドがrm
しかなくなるという意味になります。つまり、ユーザkororoは一般ユーザ権限の範囲内では、cp やmakdir
等のユーザーコマンドは全て使用することができ、プラス、rootでしか削除できないファイルをsudoから実行して削除できる権限(rm
コマンド)を得たということです。
# visudo
# Cmnd alias specification
Cmnd_Alias RM /bin/rm
# User privilege specification
%kororo ALL=(ALL) RM
|
|
逆に、システムの停止・再起動の権限をsudoから実行できないようにすることもできます。Cmnd_Alias
で設定した定義のSHUTDOWNの前に打ち消しの意味を持つ「!」をつけると、「SHUTDOWNは実行できない」という意味を持ちます。システムの停止や再起動時には、「sudo
su」や「sudo -s」を実行して、root のシェル権限を得てから慎重に行うのがベストでしょう。
# visudo
# Cmnd Alias SHUTDOWN = /sbin/halt, /sbin/shutdown,
\
/sbin/poweroff, /sbin/reboot, /sbin/fastboot,
/sbin/init
# User privilege specification
%kororo ALL=(ALL) ALL,
!SHUTDOWN |
|
◎sudoコマンドのオプション
|
-l |
現在の設定状況を表示する |
|
-s |
sudo su と同等の意味になる。root のシェルを実行する |
|
■sudoのパスワードキャッシュ
先ほども触れましたが、sudo 実行後、一定の時間内であればパスワードを再入力することなく続けてコマンドを実行することができます。このキャッシュタイムアウトは、sudoを実行するたびに更新されます。しかし、この一定の時間内(デフォルトでは5分)というのが問題になる場合もきっとあるでしょう。うっかり席を立ってしまい、その5分以内の間に悪質なユーザにシェルをいじられ重要なファイルを盗まれたり、削除されたりしないとも限りません。自宅サーバーで運用している限りはその心配はほとんどなさそうですが、企業レベルの運用となると少し不安が残ります。なので、このタイムアウトをなくして、sudo
を実行するたびにパスワードが聞かれるようにする方法も頭の片隅にいれておきましょう。記述は簡単です。キャッシュタイムアウトを10分に伸ばしたければ値を「10」にします。また、パスワードプロンプトもよりわかりやすいように改良しておきましょう。デフォルトのパスワードプロンプトでは、「Password:」と味気ないものですが、これをログインユーザとホスト名が表示されるように変更しておきます。
# visudo
Defaults timestamp_timeout = 0 //パスワードキャッシュの時間(分単位)
Defaults passprompt = "%u@%h Password:
" //パスワードプロンプトの変更 |
|
■参考
⇒@IT:止められないUNIXサーバの管理対策
第5回