コマンド
sudo
他ユーザ権限でコマンドを実行する
sudo コマンドは、root などの他のユーザ権限で特定のコマンドを実行するためのコマンドである。sudo を使うと「root パスワードを教えずに」「誰に」「どのコマンドを実行可能とする」といった細かな権限を設定できるため、セキュリティが向上する。sudo コマンドは Linux・FreeBSD 等、一般的な UNIX 系 OS で外部パッケージとして提供されているが、環境によっては既にインストール済みのことも多い。
●sudo コマンドの基本的な使い方
sudo は、一般ユーザ権限では普通実行できないコマンドを、あるユーザだけには許可したいが、root 権限を与えたくはない場合に使う。また、誰がどういうコマンドを実行したかは /var/log/messages・/var/log/syslog・/var/log/authlog などに記録される。どのログファイルに出力されるかは syslog 設定次第であるが、代表的な Linux 系 OS では、
- RHEL・CentOS 系: /var/log/secure
- Ubuntu 系: /var/log/auth.log
のようだ。
sudo の設定ファイルは FreeBSD では /usr/local/etc/sudoers (他の OS では /etc/sudoers の場合もある) だが、このファイルを直接編集してはいけない。visudo というファイル編集用のコマンドがあるので、それを使うこと。
root になって visudo コマンドを実行すると、環境変数 EDITOR で指定されたエディタが起動される。ファイルを保存してエディタを終了すると、変更した内容が /usr/local/etc/sudoers に反映される。もし書式が誤っていると、
>>> sudoers file: parse error, line 17 <<<
What now?
と、どうするのか確認を求めてくる。ここで「e」を押すと再度編集画面に戻り、「x」を押すと保存せず visudo を終了する。
sudoers ファイルには
- どのユーザが
- どのホストで
- 誰の権限で
- どのコマンドを
実行可能にするのか、ということを記述する。書式は
である。「どのホストで」というのは、複数のホストで同じ sudoers ファイルを使用することを前提としている。1つのホストのみ考慮すればよいなら、「全ホスト」を表す「ALL」を指定すればよい。
例えば「ユーザ hoge」が「全ホスト」で「root 権限」で「/sbin/reboot コマンド」を使用可能、とするなら、visudo コマンドを実行し、
hoge ALL = (root) /sbin/reboot
と書けばよい。「誰の権限で」の部分を省略すると、「root 権限で実行」とみなされるので、
としても同じである。
ユーザ hoge が sudo 経由で reboot コマンドを使いたい場合は、visudo コマンドで上記の設定した後、
とする。すると
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these two things:
#1) Respect the privacy of others.
#2) Think before you type.
というメッセージが表示される。要は
「sudo について管理者から説明されてるよね? 他のユーザのプライバシーに気をつけること。タイプする前に正しいことをしているかどうか、よ〜く考えること」
という注意書きである。そして
と、パスワードを求められるが、ここで入力するのは「ユーザ hoge の」パスワードである。root のパスワードではない。ここで正しいパスワードを入力すると、root 権限で /sbin/reboot コマンドが実行される。
なお、一度 sudo を使ってから 5 分以内に再度 sudo を実行した場合は、パスワードの入力を求めてこない。
●コマンドの指定
実行を許可するコマンドは
hoge ALL = (root) /sbin/shutdown
などとフルパスで指定する。
とディレクトリ名のみ指定すると、/foo/ 直下にあるコマンド全てを許可する。ただし、/foo/bar/・/foo/bar/baz/ などのサブディレクトリの下のコマンドは許可されない。なお、この場合のディレクトリ名の最後には、必ずスラッシュを付けなければならないので注意すること。
●引数の制限
引数を制限する方法を説明する。
hoge ALL = (root) /sbin/shutdown
上記のようにコマンド名のみを指定すると、shutdown コマンドに渡す引数はユーザが自由に決められる。
hoge ALL = (root) /sbin/shutdown -r
と引数を記述した場合は、
などと -r の後に別の引数を渡すことができない。さらに後続の引数を許したい場合は、
hoge ALL = (root) /sbin/shutdown -r *
とワイルドカードを使うとよい。引数を使用させたくない場合は
hoge ALL = (root) /sbin/reboot ""
と "" を指定する。
●パスワード入力
パスワード入力なしで実行させたいコマンドは
hoge ALL=NOPASSWD: /sbin/pkg_add
と書く。ユーザ hoge は、パスワード入力なしで /sbin/pkg_add を実行できることになる。
さらに詳しい書式は sudoers(5) を参照してほしい。
●オプション
▷ -l ユーザに許されているコマンドの一覧を表示。
% sudo -l
Password: (パスワードを入力)
You may run the following commands on this host:
(root) /usr/local/sbin/visudo
(root) /sbin/shutdown
この例では、visudo と shutdown コマンドを root 権限で実行することができる。
▷ -b コマンドをバックグラウンドで実行
▷ -u 指定したユーザ権限でコマンドを実行。以下のようにすれば、anotheruser の権限で anycommand が実行できる。
% sudo -u anotheruser anycommand
●sudo 設定の例
当ページ管理人は、
68user ALL = (root) NOPASSWD:/usr/sbin/pkg_add:\
ALL = (root) NOPASSWD:/usr/local/sbin/visudo:\
ALL = (root) /sbin/mount,/sbin/umount:\
ALL = (root) NOPASSWD:/usr/bin/make install
として、~/.cshrc に
alias visudo sudo visudo
alias pkg_add sudo pkg_add
alias mount sudo mount
alias umount sudo umount
と書いている。これにより
- pkg_add・visudo コマンドはパスワードなしで実行できる
- mount・umount コマンドは、念のためパスワードを入力する
- sudo make install とタイプすると root 権限で make install が実行される
という動作が可能になる。
●sudo と tty 【2018-12-28追加】
一部 Linux ディストリビューション (おそらく CentOS のみ) の sudo のデフォルト設定では、端末 (tty) が割り当てられていないと sudo コマンドを使うことができないような設定いなっている。
端末 (tty) が割り当てられている状態とは、コンソールや X や ssh などから「人間が」ログインした状態のことである。端末 (tty) が割り当てられていない状態とは、cron 経由でのコマンド実行だったり、下記のように ssh でコマンドを実行した場合のことである。
端末 (tty) が割り当てられていない状態で sudo を実行すると sudo は下記のエラーを出力する。
% ssh myuser@myhost.example.com 'sudo ...'
sudo: sorry, you must have a tty to run sudo
この場合、/etc/sudoers などの設定ファイルで下記のようになっているはずである。
visudo コマンドを用いて、上記をコメントアウトしてしまうのが一番簡単な方法である。
普通、人間がパスワードを入力する際、パスワードが画面上に表示されないように端末の機能を用いてエコーバックというものを OFF にするのだが、端末が割り当てられないとエコーバックを OFF にできず、画面上にパスワードがそのまま表示されてしまうため、このような設定が存在する。
そもそも sudo 配布物のデフォルト設定ファイルでは requiretty とは書かれていないし、CentOS 以外のディストリビューション (Ubuntu や Debian 等) でも requiretty が書かれていない。
よって、当ページ管理人としては requiretty をコメントアウトすればいいんじゃない、と思う次第であるが、セキュリティ的に気にする人は下記のような対応を取ることもある。
- ssh 経由でリモートの sudo を実行している場合、まず試すべきは ssh -t で実行すること。こうすると tty が割り当てられた状態で ssh が実行される。
- cron で ssh を起動するなど、そこからリモートの sudo を実行している場合、ssh -tt などと -t オプションを複数回指定する。
- Defaults requiretty をコメントアウトせず残したまま、その下に「特定ユーザのみを requiretty の対象から外す」ような設定を追記する。例は下記。
Defaults requiretty
Defaults mysuer: !requiretty
●クラウドサービスでの sudo コマンド
AWS の EC2 の Linux 系 OS や、Google Cloud Platform (GCP) の Compute Engine などでは、sudo コマンドを叩くことでデフォルトでパスワードなしで root 権限を得ることができる。
読み方
sudo
(UNIXコマンド) [すー・どぅー]
特定のコマンドのみを root 権限で実行するためのコマンド。FAQ に "soo-doo" と発音するという記載あり。superuser-do の意。日本では [すどー] と発音する人も多いと思われる。