Ubuntu Weekly Recipe

第410回 あなたの人生を少しだけ豊かにするsudoの使い方

この記事を読むのに必要な時間:およそ 6 分

皆さんsudo使ってますか? 残念ながらUbuntuは,一般的なデスクトップ用途でさえsudoのお世話になることがたまに存在します。今回はそんなsudoのお話です。

sudoとはなんぞや

sudo「指定したコマンドを別のユーザー権限で実行する」コマンドです。開発が始まったのは1980年と歴史が古く,なおかつ今でも開発が続いているソフトウェアでもあります。その挙動から「substitute user do」の略や,ユーザーを指定しないと管理者権限で実行することから「superuser do」の略とも言われています。さらにsudoコマンドと似た名前のコマンドとしてsuが存在します。こちらは主に別のユーザーに切り替えるためのコマンドで,sudoがsudoコマンドを実行しようとしているユーザーのパスワードを必要とするのに対して,suはsuで切り替える先のユーザーのパスワードが必要です。「sudo」より先に「su」が存在していたので,「su do」の略だという話もあります※1)。

※1
「su」は元々「UID=0のユーザーに切り替える」だけのコマンドだったので,本来の意味は「super user」なのかもしれません。

Ubuntuはシステム管理者である「UID=0」の特権ユーザー(一般的には「root」という名前がついています)のアカウントを「ロック」しています※2)。このため,シングルユーザーモードで起動でもしない限り,rootでログインすることはできません。管理者権限が必要な作業は,一般ユーザーがsudoコマンドを使って実施するのです。

※2
具体的には,/etc/shadowにおいてパスワードフィールドにcrypt()関数で暗号化したときに発生し得ない文字である「!」をセットすることで,どんなパスワードもエラーになるため,そのアカウントでログインできなくなります。
何かパッケージをインストールする場合:
$ sudo apt-get install panzer
[sudo] password for miho: ("miho"ユーザーのパスワードを入力する)

具体的には次のような理由日本語訳でrootアカウントがロックされ,sudoの利用が推奨されています。

  • rootのパスワードを設定しなくてよいので,インストーラーの質問項目を減らせる
  • システム管理者は本人とroot,2つのアカウントのパスワードを覚えておく必要がない
  • 何かシステムに変更を加えるときは明示的にsudoを使わなければならないので,注意を喚起できる
  • /var/log/auth.logにsudoで実行したコマンドが残るので,何かあったときに確認しやすい
  • システムに対する攻撃者は,必ず存在するであろうrootアカウントに対してブルートフォースアタックを行うことが多いので,rootアカウントをロックしておくとその攻撃に対しては安全性が高まる
  • sudoを実行できるユーザーをグループで管理できるので,複数の管理者を追加・削除しやすい
  • あるユーザーには特定のコマンドだけsudoを実行できるようにするなど,細かいポリシー設定が可能

いろいろとお題目を立ててはいますが,「外からの攻撃に対しての安全性を高める」というよりは「ユーザーが操作を誤ってシステムを壊してしまう」ことをできるだけ防ぐことが主体のようです。

ちなみにデスクトップ版のUbuntuの場合,何かアプリケーションをインストールしたり,パッケージを更新したり,「システム設定」からを設定を変更する程度であればsudoを使う必要はありません。管理者権限が必要な場合は,後ほど出てくるpolkitがパスワード入力ダイアログを表示するため,そこでユーザーのパスワードを入力すればあとは「うまいこと」やってくれます。

sudoの使い方あれこれ

sudoの使い方は「sudo "実行したいコマンド"」を端末に入力する,これだけです。パスワードが問われるので「sudoを使うユーザー」のパスワードを入力してください。なお,セキュリティの観点から入力結果は画面にはまったく表示されません。反応のなさを恐れずにパスワードを入力し,粛々とエンターキーを押せば,最後にはシステムが応えてくれるはずです。

この使い方でほとんどの目的は果たせるはずですが,それでもたまにはすこし違う使い方が必要になることもあります。ここではsudoを使う上で知っておいたほうが便利なことをいくつか紹介しましょう。

リダイレクト先で特権が必要な時

日常的にsudoを使う時に最初に困るのが,パイプやリダイレクトの先で特権が必要な場合でしょう。たとえば何か文字列をechoし結果を,管理者権限でしか書き込めないファイルに追記したい場合,ドキュメントで次のコマンド例を提示されることがしばしばあります。

# echo "foo" > /etc/bar.conf

これをそのままsudoに置き換えても動きません。

$ sudo echo "foo" > /etc/bar.conf
bash: /etc/bar.conf: 許可がありません

エラーメッセージからもわかるとおり,「/etc/bar.conf」に書き込もうとしているプロセスはbashです。sudoコマンドによりechoは管理者権限で起動していますが,その親プロセスは一般ユーザーの権限なので,当然書き込めないというわけです。

このようにリダイレクト先で特権が必要な時はteeコマンドを使います。

$ echo "foo" | sudo tee /etc/bar.conf
[sudo] password for miho:
foo

teeコマンドは標準入力を,標準出力と指定したファイルの双方に書き出すコマンドです。このteeコマンドを管理者権限で起動すれば,/etc/bar.confにも書き出せるというわけです。ちなみにteeコマンドにオプションをつけない場合はファイルを上書きします。ファイルに追記したい場合は,「-a」オプションをつけてください。

別の手段として,シェルを管理者権限で起動するという方法もあります※3)。

※3
shコマンドはdashへのシンボリックリンクです。bashの拡張機能を使いたい場合はbashに変更してください。
$ sudo sh -c 'echo "foo" > /etc/bar.conf'

この方法は,ドキュメントに例示してあるコマンド列をそのまま使用できることに加えて,/var/log/auth.logにそのコマンド列がそのまま残るというメリットがあります。

teeを使った場合のログ:
sudo: (中略) COMMAND=/usr/bin/tee /etc/bar.conf

shを管理者権限で起動した場合のログ:
sudo: (中略) COMMAND=/bin/sh -c echo "foo" > /etc/bar.conf

しかしながら本来管理者権限は必要ないコマンドまで管理者権限で実行することになります。どちらを使うかは状況にあわせて判断してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入