対象とするUbuntuのバージョン
- 全て
この文書はRootSudo(英文)の翻訳です。 誤記、誤訳が疑われる箇所については、オリジナルの文書を参照下さい。
注意: sudoの設定についての詳細は、設定ファイル/etc/sudoersを参照下さい。
背景
Linux(およびUnix一般では)、rootという名前の管理者アカウントが存在します。Windowsにおいては、Administratorsグループに相当します。管理者アカウントでは、どんな操作でもできてしまいます。それゆえ日々の作業を管理者で行うのは非常に危険です。コマンド入力を間違えてシステムを破壊するといったことも起き得ます。理想的には操作に必要な権限のみを持ったユーザで、作業を行うべきです。ときには、rootになることが必要かも知れませんが、ほとんどの場合は、一般ユーザで問題ありません。
Ubuntuのデフォルト設定では、rootアカウントのパスワードはロックされた状態にあります。つまり、suコマンドを使って、rootとしてログインすることはできないということです。しかしながら、rootアカウント自体は存在し、プログラムをrootとして実行することは可能です。ここで、sudoの出番です。あらかじめ許可されたユーザに対して(通常は"admin"グループに属するユーザです)、プログラムをrootのパスワード無しに実行することを可能とします。
すなわち、管理者権限を必要とするコマンドを実行する際に、「端末」にてsudoコマンドを使うこととなります。方法は簡単で、sudoを前に付けて半角スペースを開け、通常どおりに実行するコマンドをタイプするだけです。より高度な使い方の例としては、この文書の続きを参照下さい。同様に、root権限を必要とするGUIプログラム(例えばネットワーク設定アプレットなど)を実行する際には、グラフィカルなsudoを使い、パスワード要求画面を呼び出して下さい(詳細はグラフィカルなsudoの項を参照下さい)。重要なのはsudoが要求するパスワードはあなた自身のアカウントのパスワードであり、rootアカウントのパスワードでは無いということです。
長所と短所
sudoを使用することの長所
rootアカウントでのログインを不可とすることの利点としては、下記のようなことが挙げられます。
- Ubuntuをインストールする際の、質問の回数を減らすことができます。
- ユーザが(rootアカウント用の)余計なパスワードを覚えなくてもよくなります(忘れてしまうと困ります)。
- デフォルトで、なんでもできてしまうアカウントでのログインが禁止されます(例えばMicrosoft Windowsなどでは、ユーザは"Administrator"でログインしてしまいがちであるように見受けられます)。大きな変更を加える際、パスワードの入力を求められるようにすることで、ユーザはなにをしようとしているか再認識することができるようになります。
sudoはコマンド実行のログを(/var/log/auth.logに残します)。もし、なにか不具合が発生した際には、どのようなコマンドを実行したのかを確認することができます。また、これはシステム監視の意味でも有用です。
brute-force(訳注: ブルートフォース、パスワードの総当たりなど強引な手法を指す)的な方法であなたのシステムに侵入を試みるクラッカー(訳注: コンピュータへの攻撃者)はrootというアカウントが存在することを知っています。そして、それを最初の攻撃の対象とするでしょう。しかし、あなたのシステムに存在する他のアカウント名を、クラッカーは知りません。rootアカウントのパスワードがロックされていれば、攻撃したり推測したりする対象のパスワードが存在しないのですから、この攻撃は意味を持ちません。
短期、長期を問わず、ユーザを管理者グループに追加、もしくは、管理者グループから削除することにより、rootアカウントを複数のユーザで共有するのでは無く、簡単に管理者権限への昇格の可否を変更する手段を提供します。
- sudoでは、よりきめ細かいセキュリティポリシーを設定することができます。
- 管理者権限を要する作業をする複数のユーザ間で、rootアカウントのパスワードを共有する必要がありません(上記参照)。
- 管理者権限への昇格の認証は、短時間(任意に短く、または、0に設定できます)で自動的に破棄されます。仮にsudoを使ってroot権限でのコマンド実行中に席を外すようなことがあったとしても(訳注: 極端すぎる例です。後述のsudo -kを参照下さい。また、離席時はスクリーンをロックして下さい。)、rootで開いた端末を放置して席を外すようなことは絶対にしてはいけません。
sudoを使用することの短所
デスクトップ用途での、sudoを使うことによる利点は大変なものですが、留意するべき問題点もあります。
sudoを使ってのコマンド実行の出力をリダイレクトするためには、特別な取扱いが必要になります。一例としては、sudo ls > /root/somefileはファイル出力をしようとするのがシェルであるため機能しません。代わりにls | sudo tee -a /root/somefile、もしくは、ls | sudo tee /root/somefileを使って下さい。あるいは、root権限を要するファイル出力のために、sudo sh -c "ls > /root/somefile"のようにしてコマンド全体をsudoを使って実行したシェルに渡すこともできます。
- 多くのオフィス環境では、個々のシステムの唯一のローカルユーザはrootであり、他の全てのユーザはnss-ldapのようなNSS技術を用いてインポートされるでしょう。ワークステーションの設定や修復の際に、ネットワーク接続不良となり、nss-ldapが壊れてしまったようなケースではrootが必要となります。こうなるとクラックしない限りシステムは使用不可になります。他のローカルユーザの存在か、rootパスワードを有効にする必要がでてきます。ローカルユーザはその$HOMEをNFS(や他のネットワークファイルシステム)ではなくローカルディスクに持つ必要があります。かつ、.profile/.bashrcがNFSマウントのファイルを参照していてはいけません。これらは通常はrootの要件ですが、非rootの緊急時用のアカウントを作成する場合、これらを手動で設定しておかなくてはなりません。
- 別の手法としては、sysadminタイプのアカウントをsudo権限を持ったローカルユーザとして実装しておく方法があります。上記の長所の項目に説明されるように、簡単にコマンド実行来歴を確認することができます。
使用方法
- sudoを使う場合、デフォルトでは15分間パスワードが記憶されます。その後、パスワードを再度入力する必要があります。
あなたのパスワードは、タイプしても画面には表示されません。伏せ字(******)も表示されません。しかし、入力はされています。
sudo
sudoをコマンドラインで入力するとき、下記のようにsudoに続いてコマンドを入力して下さい。
例 #1
sudo chown bob:bob /home/bob/*
例 #2
sudo /etc/init.d/networking restart
最後に実行したコマンドをsudoを使って繰り返して実行する場合、下記を実行して下さい。
sudo !!
グラフィカルなsudo
グラフィカルなアプリケーションをroot権限で実行する場合、決して通常のsudoを使ってはいけません。その場合は、gksudo (Kubuntuではkdesudo)を使うべきです。gksudoは環境変数$HOMEを~rootに設定します。そして、.Xauthorityをtmpディレクトリにコピーします。これにより、あなたのホームディレクトリの所有者がrootに変わってしまうことを防ぎます(私(訳注: 原文の筆者を指します)の知る限り、この環境の違いだけがgksudoとsudoでプロセスを起動する際の違いとなります)。
訳注: 環境変数についての補足説明 環境変数とは様々な設定を記憶しておくための変数です。例えば$HOMEには、そのユーザのホームディレクトリが記憶されています。プログラムの中にはこの$HOMEの場所を読み取り、そこに設定ファイルを生成したりするものがいます。 sudoを使った場合、この$HOMEにはそのユーザのホームディレクトリが記憶されたままになります。これにより、sudoで呼び出したプログラムがユーザのホームディレクトリに設定ファイルを作成したり、ということが起き得ます。gksudo/kdesudoの場合は$HOMEを~rootに設定します。~rootはroot(管理者ユーザ)のホームディレクトリを意味しており、$HOMEに設定ファイルを作るようなプログラムを起動したとしてもユーザのホームディレクトリに設定ファイルが生成されるということが起きません。 sudoで呼び出したプログラムは管理者が呼び出したプログラムとなるため、設定ファイルが生成される場合、管理者ユーザのファイルとなります。パーミッション(権限)の設定にもよりますが、一般ユーザが同じプログラムを起動した際に、設定変更できないなどの影響がでる可能性があります。
例
gksudo gedit /etc/fstab
または
kdesudo kate /etc/X11/xorg.conf
- 単純にグラフィカルな設定ツールを起動する場合は、システム管理メニューから起動して下さい。
gksudo、および、kdesudoは、それぞれgksu、および、kdesuへのシンボリックリンクです。
ドラッグ & ドロップ sudo
Ubuntu Forumsのこのトピック(英文)から、小技を紹介します。
下記のコマンドへのランチャーを作成します。
gksudo "gnome-open %u"
ファイルをこのランチャー(デスクトップかパネルに配置しておくと便利でしょう)にドラッグ & ドロップすると、そのファイルが関連付けされたアプリケーションで、root権限でファイルが開かれます。これはrootが所有者である設定ファイルを編集する際などに便利です。なぜなら、デフォルトでは書き込み不可(一般ユーザ権限)でファイルがテキストエディタ(gedit)などで開かれてしまうからです。
ユーザ
他のユーザにsudoの実行権を与えるには
新しいユーザにsudoの実行権を与えるには、システム->システム管理メニューから、ユーザとグループ設定ツールを開いて下さい。そして、ユーザを選択し、そのプロパティを開いて下さい。ユーザの権限タブを選択し、その中からシステムの管理者であるを見つけてチェックを入れて下さい。
Hardy Heron、および、より新しいバージョンのUbuntuでは、最初にロック解除を押してから、ユーザリストからユーザを選択し、プロパティを開いて下さい。ユーザの権限タブを選択し、システムの管理者であるにチェックを入れて下さい。
端末では、これは下記に相当します。
sudo adduser <username> admin
ここで、<username>は操作対象のユーザ名を表します(<>は付けないで下さい)。
別のユーザとしてログインする
これをrootとしてログインする方法としては使わないで下さい。この件に関する詳細は、この文書の「sudoとシェルについての注記」の項目を参照下さい。
sudo -i -u <username>
例えば、テープドライブの管理権限を持つユーザ、amandaとしてログインするには以下を実行します。
sudo -i -u amanda
パスワードはamandaのものではなく、あなた自身のものが要求されます。
rootアカウント
rootアカウントの有効化
|
rootアカウントの有効化が必要になることは、滅多にありません。Ubuntuシステムの管理者として実行しなければならないことのほぼ全てはsudoもしくはgksudoで実行できます。もし、どうしてもrootでのログインが必要である場合は、以下のコマンドにより、rootログインシェルをシミュレートすることが最善の代替手段となるでしょう。 |
|
(訳注: 「sudoとシェルについての注記」の項も併せて参照願います)
sudo -i
rootアカウント自体を有効化する場合は、
sudo passwd root
などとしてrootにパスワードを設定します。
これはあなた自身の責任において実施して下さい 。
|
rootとしてXにログインすることは時として深刻なトラブルを引き起こします。もしあなたが、どうしてもそうする必要があると考えるのであれば、まず最初にサポートチャンネル(訳注: フォーラム、メーリングリスト、IRCを指すものと思われます)に相談し、本当により良い対案が無いのか確認して下さい。 |
|
一度有効にしたrootアカウントの無効化
|
なんらかの理由で有効にしたrootアカウントを再び無効にするには、以下のコマンドを実行して下さい。 |
|
sudo usermod -p '!' root
その他
よくある誤解について
sudoはsuよりセキュアでは無いのでは?
基本的なセキュリティモデルは同じです。それゆえ、どちらも主な脆弱性は同じです。su もしくは sudoを使うユーザは誰であれ、管理権限を持っているユーザであるということです。それらのユーザのアカウントが攻撃者により乗っ取られたら、次に攻撃者はユーザがするのと同じ方法でroot権限を取得することができます。ユーザアカウントはこの連鎖の中で弱い部分となります。そのため、rootアカウント同様、慎重に保護する必要があります。 より深い理解としては、sudoは異なる作業習慣を身につけさせるという副産物があり、それはシステムのセキュリティに良い影響を与えます。sudoは一般的にはひとつだけのコマンドを実行するために使われますが、suは通常はシェルを開くために使われ複数のコマンドが実行されます。sudoを使う方法では、rootでのシェルが開きっぱなしになってしまう機会を減らすことができますし、ユーザがroot権限を行使するのを最小限に留めさせるでしょう。
シングルユーザモードに入れない!
- Ubuntuのsuloginプログラムはロックされたrootパスワードを取り扱えるように改変されています。
端末からパスワード無しにrootシェルを起動できてしまう!
- あなたのパスワードを入れる必要があります。
端末を使用する場合、ブートローダにアクセスすることができ、ブートプロセスの間に様々な方法で管理者権限を取得することが可能です。例えば、init(8)プログラムに代わる別のプログラムを指定するなどの方法が考えられます。Linuxシステムは典型的には端末においてセキュアに設定されていません。セキュアにするには追加の(例えば、rootパスワードを設定する、ブートローダのパスワードを設定する、BIOSパスワードを設定するなど)処置が必要になります。端末を使用するユーザは物理的にマシンを操作することができ、様々な方法でマシンを操作できるという点に注意して下さい。
- あなたのパスワードを入れる必要があります。
sudoとシェルについての注記
下記の方法はいずれも、Ubuntuの開発者からは、推奨もサポートもされない方法です。
rootでシェルを実行することにより問題が発生する可能性があるため、あなたが年間365日、24時間のサポートを個人的に提供できる場合を除き、これらを他者には勧めないで下さい。
rootシェル(rootとしてコマンドが実行できるシェル)をrootの環境とログインスクリプトを使って実行するには、
sudo -i #(sudo su - に似ています)
を実行します。
root shellを現在のシェルの環境を維持して実行するには、
sudo -s #(sudo su に似ています)
を実行します。
su、su -、sudo -{i,s}の違いについての大まかな説明は、"Ubuntu Forums Post with nice table(英文)"を参照下さい。
詳細については、man su、および、man sudoを参照下さい。
sudo実行時のパスワードの要求を止めるには
|
もし、あなたのアカウントに対してsudoのパスワード要求を無効にした場合、あなたのコンピュータは深刻な脆弱性を持つことになります。あなたの離席時に、誰かがログインしてroot権を奪ってしまうかも知れません。また、悪意あるクラッカーにとっても、リモートからの侵入がはるかに容易になることでしょう。 |
|
下記の方法はいずれも、Ubuntuの開発者からは、推奨もサポートもされない方法です。
あなたが年間365日、24時間のサポートを個人的に提供できる場合を除き、これらを他者には勧めないで下さい。
以下の手順は、sudoコマンドの実行時の、パスワード要求を止めるためのものです。 しかしながら、sudoコマンドはroot権限が必要なときにのみ使うべきです。
sudoersファイルの編集
(訳注: この項目の内容が必要になることは、まず、無いはずです。一方、sudoersファイルの編集を間違えると、最悪の場合、管理者権限での作業ができなくなります。どうしても必要である場合以外は参照しないで下さい。)
端末を開き、sudo visudoと入力します。 以下の行を開いた設定ファイル最後の部分に追加します(最後に書かない場合、後続の設定で書き換えられるかもしれません)。
<username> ALL=NOPASSWD: ALL
<username>はあなたのユーザ名に置き換えて下さい(<>は書かないで下さい)。典型的なUbuntuシステムでは、ユーザ名と同じ名前のグループを作成しているはずで、それを前提としています。usersやあなたが所属する他のグループ名に置き換えても構いません。あなたが、そのグループに所属していることだけは確認して下さい。確認は、システム->システム管理->ユーザとグループでできます。
例:
michael ALL=NOPASSWD: ALL
編集を終えて抜ける時は、^xを押して下さい。ファイルを保存するか聞かれるはずなので、保存するにはYと答えて下さい(訳注:エディタとしてnanoが立ち上がるときです)。
ログアウトして、再度、ログインして下さい。sudoコマンドがパスワード要求無しに実行できるようになっているはずです。
sudoタイムアウトのリセット
sudoコマンドに、次回実行時にパスワード要求させるには、下記を実行して下さい。
sudo -k


