UNIX/Linuxの部屋 コマンド:sudo


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド sudo 他ユーザ権限でコマンドを実行する

sudo コマンドは、root などの他のユーザ権限で特定のコマンドを実行するためのコマンドである。sudo を使うと「root パスワードを教えずに」「誰に」「どのコマンドを実行可能とする」といった細かな権限を設定できるため、セキュリティが向上する。sudo コマンドは Linux・FreeBSD 等、一般的な UNIX 系 OS で外部パッケージとして提供されているが、環境によっては既にインストール済みのことも多い。


sudo コマンドの基本的な使い方
sudo は、一般ユーザ権限では普通実行できないコマンドを、あるユーザだけには許可したいが、root 権限を与えたくはない場合に使う。また、誰がどういうコマンドを実行したかは /var/log/messages や /var/log/syslog に記録される。

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 ALL = /sbin/reboot
としても同じである。

ユーザ hoge が sudo 経由で reboot コマンドを使いたい場合は、visudo コマンドで上記の設定した後、
% sudo reboot
とする。すると
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 について管理者から説明されてるよね? 他のユーザのプライバシーに気をつけること。タイプする前に正しいことをしているかどうか、よ〜く考えること」
という注意書きである。そして
Password:
と、パスワードを求められるが、ここで入力するのは「ユーザ hoge の」パスワードである。root のパスワードではない。ここで正しいパスワードを入力すると、root 権限で /sbin/reboot コマンドが実行される。
なお、一度 sudo を使ってから 5 分以内に再度 sudo を実行した場合は、パスワードの入力を求めてこない。

コマンドの指定
実行を許可するコマンドは
hoge ALL = (root) /sbin/shutdown
などとフルパスで指定する。
hoge ALL = (root) /foo/
とディレクトリ名のみ指定すると、/foo/ 直下にあるコマンド全てを許可する。ただし、/foo/bar/・/foo/bar/baz/ などのサブディレクトリの下のコマンドは許可されない。なお、この場合のディレクトリ名の最後には、必ずスラッシュを付けなければならないので注意すること。

引数の制限
引数を制限する方法を説明する。
hoge ALL = (root) /sbin/shutdown
上記のようにコマンド名のみを指定すると、shutdown コマンドに渡す引数はユーザが自由に決められる。
hoge ALL = (root) /sbin/shutdown -r
と引数を記述した場合は、
% sudo shutdown -r now
などと -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 コマンド
AWS の EC2 の Linux 系 OS や、Google Cloud Platform (GCP) の Compute Engine などでは、sudo コマンドを叩くことでデフォルトでパスワードなしで root 権限を得ることができる。
>> Linuxオンラインマニュアル(man) Linux sudo(8)

読み方 sudo (UNIXコマンド) [すー・どぅー]

特定のコマンドのみを root 権限で実行するためのコマンド。FAQ に "soo-doo" と発音するという記載あり。superuser-do の意。日本では [すどー] と発音する人も多いと思われる。


頑張って書いたおすすめコンテンツ!