sudoの設定方法
Ubuntuをやラズベリーパイを使っていると、管理者権限が必要なコマンドを実行する際にsudoを使うため、なんとなく管理者権限を取得するコマンドのように認識されがちですが、sudoは「コマンドを他のユーザとして実行する」ものです。
Ubuntuやラズパイでも基本的な設定方法は同じですが、Debian11の利用時を前提にその使い方をArch Linux:「sudo」や、「man sudoers」のドキュメントを参考にまとめました。
以前Webブラウザベースで稼働する画像転送アプリや、音楽再生アプリなどを紹介したことがありますが、sudoとWebアプリを連動させる事で通常では実行できない管理者権限の必要なコマンドを実行できるようになり、アプリでできることが広がります。(ただしセキュリティには気を付けてください)
sudoのしくみ
sudoにはいくつかのオプションがありますが、その中に実行ユーザーを指定する-uオプションというものがあります。このオプションの後に実行したいユーザーを指定する事で、許可されていれば指定したユーザーになり替わってコマンドを実行します。
-uオプションを付けない場合、ユーザーにrootを指定したのと同じ扱いになります。そのような挙動により管理者権限が必要な場合にsudoを-uパラメータなしで使います。
Debianではデフォルトでsudoはインストールされていないと思いますが、APTでインストール可能です。
# apt install sudo
visudo
通常sudoの許可設定は/etc/sudoersに記述されています。これはエディタから直接編集することもできますが、visudoを使って修正することをお勧めします。
というのも、誤った設定を入力してsudoersファイルが機能しなくなると、管理者権限の取得時に処理がエラーで中断されてしまいます。
sudoersファイルの編集にも管理者権限が必要なため、通常のログインからは修正ができなくなってしまいます。
Debianを利用していて、sudoを別途インストールした場合はその際にvisudoもインストールされると思います。
エントリーの編集
前述のような理由から、visudoを使って編集をします。管理者権限でvisudoを実行するとsudoersファイルを読み込んだエディタが立ち上がります。
$ su ... # visudo ...
環境によりvisudoが利用するエディタは変わります。/usr/bin/editorに登録されているエディタでファイルを開くようになっています。
これは「 update-alternatives --config editor 」で修正することもできますが、ここでは他への影響も考えて現在のセッションだけで変えたいと思います。
とします。また、後で紹介しますが設定ファイルに利用したいエディタを記述する方法もあります。
最もシンプルな書き方は、
ユーザー ALL = コマンド
の形式だと思います。「ユーザー」は「コマンド」をroot(管理者)として実行できます。
ALLの部分は「ホスト名」にあたります。利用するPCにホスト名がつけられていると思いますが、それを制限する項目です。
多くの場合ははPC毎にsudoersファイルをもつので、ホストを意識する必要はないと思います。
ひとつのsudoersファイルを多くのPCで共通して使いたい場合にここにホスト名をセットしてPCに応じた設定を記述するようですが、その場合はLDAP等で集中管理した方が賢明だとmanページでは説いてました。
sudoでコマンドを実行する際は、元のユーザーのパスワードの入力が必要ですが、設定行のコマンド記述の手前に、NOPASSWD: を入れるとパスワードの入力なしで実行できるようになります。
またコマンドの部分をディレクトリにすると、ディレクトリにあるコマンドすべてが対象となります。
user1 ALL = NOPASSWD: /usr/sbin/
sudoersファイルの詳細
おそらく多くのケースがここまでの設定で目的を達成できると思いますが、「 man sudoers 」のドキュメントよりもう少し細かな設定を紹介していきます。
まず、sudoersファイルを開くとでてくる「 Defaults 」から始まる記述についてです。
Defaults env_reset Defaults mail_badpass Defaults secure_path="/user/local/sbin:/user/local/bin:..."
これは文字通りデフォルトの設定をしています。デフォルトに記述されているものの他、使いそうなものをいくつかピックアップしてみました。
- env_reset
sudo時に環境変数の設定をリセットします
- mail_badpass
sudoでパスワードを間違えた場合にメールを送信します。メールの送信先は「 mailto 」オプションで指定できます。この時@をsudoが解釈しないように値を"で囲みます。また、sudoコマンドが実行されるたびにメールを送信するmail_all_cmndsもあります。
- secure_path
sudoが実行される際のパスを指定します。
- passwd_timeout
パスワードの入力を求められた際のタイムアウトを指定します。単位は分で、5.5のように少数を入力することが可能です。
また0を入力するとタイムアウトがなしになります。
Defauts passwd_timeout=5.5 - timestamp_timeout
一度パスワードを入力した後で再びパスワードを入力聞かれるようになるまでの時間で、デフォルトは5分です。
0を設定すると常にパスワード入力を求めるようになり、マイナスの値を入力するとリブート時まで再入力が不要になります(sudo -k 等を実行した場合は除きます)。
- passwd_tries
パスワード入力をリトライできる回数で、デフォルトは3回です。
- edior
先ほどは起動時のEDITOR変数を利用してエディタを指定しましたが、設定ファイルにも入れられます。
Defauts editor=/usr/bin/vim
エイリアス
sodoersファイルの「 Defaults 」のエントリーの後にはエイリアスを各スペースがあります。エイリアスには利用する場所別に、User、Runas、Host、Cmnd(コマンド)の4種と、組み込みのエイリアスALLがあります。
これらに値を設定することで、設定の簡略性や可視性を上げることができます。
- User
ユーザーエイリアスを設定するには次のようにします。
指定されたエイリアスは設定中のユーザーの別名として利用できます。
User_Alias 任意の名称 = ユーザー名(, 区切りで複数指定可能) User_Alias GUEST = user1, user2 User_Alias MANAGER = user3, user4, user5
- Runas
Runasは先の使い方の紹介の部分で省略した部分です。
最初の説明でsudoは他のユーザーで実行できるコマンドと説明しました。この他のユーザーを指定できるのがRunasの部分です。
= の後()で囲んで、ユーザーとグループを指定することができます。この設定がされていない場合、すべてのユーザーやグループを選択できることができます(sudo実行時に指定をしなければrootになります)。
ユーザー ALL = (実行ユーザー) コマンド ユーザー ALL = (実行ユーザー : 実行グループ) コマンド ユーザー ALL = (: 実行グループ) コマンド
Runasエイリアスはこのユーザーやグループの別名として利用できます。
Runas_Alias 任意の名称 = ユーザーまたはグループ名(, 区切りで複数指定可能) Runas_Alias RUNASSUSER = userA, userB Runas_Alias MANAGER_GROUP = sales_manager, account_manager
- Host
Hostエイリアスは、ホスト名のエイリアスを設定できます。IPアドレスで指定する際はサブネットマスクまで設定することができます。
Host_Alias 任意の名称 = ホスト名またはIP/[サブネット](, 区切りで複数指定可能) Host_Alias SERVERS = server1, server2 Host_Alias MYNETWORK = 192.168.1.0/255.255.255.0
- Cmnd
コマンドエイリアスは実行できるコマンドのエイリアスです。
エイリアスに限ったことではなく直に記述する場合もそうですが、コマンドにはサブコマンドやオプションを含めることができます。
また、「 * (0個以上の任意の文字) 」「 ? (1字以上の任意の文字) 」、「 [...] (指定されたいずれかの文字)、「 ! (否定、[]内で使うと内側の文字の否定) 」「 ¥ (*?[]のエスケープ) 」といった書式が使えます。これは正規表現ではありません。
Cmnd_Alias 任意の名称 = コマンド(, 区切りで複数指定可能) Cmnd_Alias HALTCOMMAND = /usr/sbin/init 0, /bin/systemctl poweroff
- ALL
ALLは組み込みのエイリアスで、どこの場所で何に対しても一致するものです。このエイリアスの定義は予約されているため、書き換えることができません。
このように設定されたエイリアスを、設定内で利用する事ができます。
User Privilege
User Privilege specficationの箇所は、ユーザーに対しての権限の設定を記述する場所です。
sudoresファイルには明確な記述場所の概念はないのでどこに書いてもいいのですが、多くの設定はここに記述されることになります。
ここにはデフォルトで次のようなエントリーがあります。
root ALL=(ALL:ALL) ALL
これはrootユーザーは、どのホストでも、どのユーザーやどのグループでも、どんなコマンドでも実行できるという設定です。
グループ単位の設定
ユーザーだけでなくグループにも権限を指定できます。この時グループであるということを示すために%を付けます。
デフォルトの記述では「Allow members of group sudo execute any command」と記述のある次の行に次のような記述があります。
%sudo ALL=(ALL:ALL) ALL
この設定によりsudoグループに所属するユーザーは、sudoが制限なく使えます。
inculde
デフォルトではsudoersの最後に次のようなエントリーがあります。
#inculdedir /etc/sudoers.d
これはコメントアウトされているわけではなく有効なエントリーで「 /etc/sudoers.d 」から設定を読み込む指示となっています。
このディレクトリには最低でもひとつのファイルが必要でなおかつ、ファイルの権限は0440である必要があります。デフォルトではすべてコメントのREADMEファイルがあるだけです。
設定ファイルを指定したい場合はデフォルトで指定されているそのディレクトリにファイルを入れればいいのですが、「 #include 」エントリーでファイル単体で指定することもできます。
同じ設定があった場合は後優先になります。
visudoからデフォルトの/etc/sudoers以外のファイルを編集したい場合は-fオプションでファイルを指定します。
この時も、ファイルを閉じた後構文チェックをしてくれますが、単にファイルの構文チェックだけを行いたい場合は-cオプションを使います。-cオプション使用時、/etc/sudoersファイルから他のファイルを#includeしている場合は-fオプションを付けなくてもまとめてチェックしてくれます。
# visudo -f /etc/sudoers.d/other-sudoers # visudo -c -f /etc/sudoers.d/other-sudoers /etc/sudoers.d/other-sudoers: 正しく構文解析されました
sudo su
先の通り、sudoersの設定でtimestamp_timeoutにマイナス値を設定すればパスワードを再度聞かれることはありませんが、Ubuntuやラズベリーパイではsudoを付与するのが面倒な場合があると思います。その場合はsudo suを実行すれば管理者権限のプロンプトに移行できます。