# Linuxでsudoコマンドをパスワードなしで使う `sudo apt update` `sudo systemctl restart nginx` `sudo reboot` [[Linux]]を使っていると、`sudo`コマンドを頻繁に使うことになります。しかし、毎回パスワードを入力するのはだんだん面倒になってきますよね。 その面倒さがピークに達すると、結局、sudoのパスワード入力を省略する設定に手を出したくなるものです。この記事にたどり着いた皆さんも、きっと私と同じような気持ちになっていることでしょう。 この記事では、`sudo`コマンドのパスワード入力をなくす方法をまとめます。 ![Tuxと鍵で表現されたLinuxのセキュリティ](/media/whitedec/blog_img/vaBoSfdn.webp) ## sudoの設定はどこにある?そして修正方法は? sudoの設定ファイルはここにあります。 `/etc/sudoers` sudoの設定は、文法が間違っていると非常に困ったことになります。設定を誤って`sudo`自体が使えなくなると、復旧が面倒です。そのため、専用コマンドである`visudo`を使います。 ```bash sudo visudo ``` `visudo`は保存時に文法チェックを行い、誤字があればすぐに教えてくれます。公式マニュアルでも、必ず`visudo`を使うようにと記載されています。 ## ただし、/etc/sudoersを直接編集するのは避けよう `sudo visudo`と入力すると、すぐに`/etc/sudoers`が開かれ、直接編集することができます。しかし、`/etc/sudoers`ファイルを直接開いて編集するのはあまり良い習慣ではありません。 私は通常、メインの設定ファイルには手を触れず、`/etc/sudoers.d/`ディレクトリに新しいファイルを生成しておくことを推奨します。 こうすることで、後で何を変更したかが見つけやすく、元に戻すのも簡単です。 sudoは、追加設定を以下のディレクトリ内のファイルからインクルードするように設計されています。 実際に`/etc/sudoers`ファイルの最終行には、`include /etc/sudoers.d/`という記述が見られます。 ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` ファイル名は自由に、後で分かりやすいように作成すれば大丈夫です。 ただし、あまり適当な名前をつけない方が良いでしょう。後で自分自身が困ることになります。 ああ!ちなみに、`~`や`.`を含むファイル名はsudoersが無視するとされています。ディレクトリ内のREADMEファイルに、そのような内容を案内するコメントがありました。 ## 設定形式を知ろう sudoersの設定はだいたいこのような形式です。 本当に...覚えられる文法ではありません。どこかにメモするか、このブログページをお気に入りに入れておきましょう。頻繁に使うわけではありませんが、たまに使おうとすると忘れてしまいます。 ```bash ユーザー名 ホスト=(実行ユーザー) オプション: コマンド ``` 例えば、ユーザー名が`potter`で、`apt update`をパスワードなしで実行したい場合は、このように記述できます。 ```bash potter ALL=(ALL) NOPASSWD: /usr/bin/apt ``` 各部分を分解すると以下のようになります。 * potter : 設定を適用するユーザー名。 * ALL : すべてのホストで適用する。 * (ALL) : どのユーザー権限で実行できるかを意味します。時々(root)と書いている人も見かけましたが、私はALLにしています。 * NOPASSWD: パスワードを尋ねない。 * /usr/bin/apt : 許可するコマンドの「絶対パス」です。 コマンドのパスがわからない場合は、`which`で確認できます。 ```bash ~$which apt /usr/bin/apt ~$which apt-get /usr/bin/apt-get ~$which reboot /usr/sbin/reboot ~$which systemctl /usr/bin/systemctl ``` ## ALLですべて許可したくなる誘惑 ここで非常に強い誘惑が訪れます。 ```bash potter ALL=(ALL) NOPASSWD: ALL ``` 非常にすっきりしています。すべてのsudoコマンドをパスワードなしで実行できます。便利ですよね。とても便利です。 個人の選択ですが、これは我慢する方が良いと私は考えます。誤って入力したコマンド一つが、すぐにroot権限で実行されてしまう状況は想像したくありません。 スクリプトが意図しない動作をしても、パスワード入力という最後のブレーキがありません。 ターミナルを一時的に開いた状態で誰かに触られても、そのまま実行されてしまいます。世の中には変な人が多いですからね... 選択は皆さん次第です。 ## よく使うコマンドだけパスワードなしで許可する 私は「よく使うものだけ許可する」という方針で妥協しています。この方法はかなり良いと思います。 例えば、`apt`、`apt-get`、`reboot`、`systemctl`程度だけパスワードなしで使いたいとしましょう。 まず、設定ファイルを開きます。 ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` 以下のように記述します。 ```ini potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot, /usr/bin/systemctl ``` これで`potter`さんは、以下のコマンドをパスワードなしで実行できます。 ```bash sudo apt update sudo apt -y upgrade sudo apt-get update sudo reboot sudo systemctl reload nginx ``` `systemctl`すべてを許可するのが気になる場合は、特定のコマンドだけを許可することもできます。 ```bash potter ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx ``` ## 複数行に分けて書くと読みやすい コマンドが多くなると1行が長くなり、見づらくなります。このような場合は、`\`で改行することができます。 [[Linux]]ユーザーにはお馴染みの改行方法ですが、不思議と実際にやろうとすると`\`をあまり使わないことがあります。 しかし、やはり使うと可読性が向上します。 ```bash potter ALL=(ALL) NOPASSWD: \ /usr/bin/apt, \ /usr/bin/apt-get, \ /usr/sbin/reboot, \ /usr/bin/systemctl ``` 見た目も良く、すっきりしましたね。 ## 特定のグループに適用する この設定も非常に便利です。複数人で管理するサーバーでは、グループ単位で管理する方が便利な場合があります。 特定のグループにのみ適用したい場合は、`%グループ名`の形式で記述します。 例えば、`admin`グループであればこのようになります。 ```bash %admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt, /usr/bin/apt-get ``` ## パスワード入力の有効時間を延長する パスワードを完全に無くすのは少し抵抗があるという場合は、別の方法もあります。それは、パスワードを再度尋ねるまでの時間を調整することです。 基本的に、一度パスワードを入力すると10分か15分程度は再入力が不要になりますが、この時間を調整できます。 `timestamp_timeout`設定を利用する方法です。 例えば、このように設定すると60分間sudoパスワードを再入力する必要がなくなります。 ```bash Defaults timestamp_timeout=60 ``` 単位は「分」ですが、「0」を設定すると常にパスワードを入力しなければならない悪夢になります。 「-1」に設定すると、一度入力したsudoパスワードはターミナルを閉じるまで再入力が不要になります。これは`ALL`に匹敵する強力な利便性ですが、使用には多少の懸念も伴います。 もちろん、パスワードなしで許可する設定と、有効時間を延長する設定は共存可能です。 例えば、このように組み合わせることができます。 ```bash Defaults timestamp_timeout=30 potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot ``` 頻繁に使うコマンドはパスワードなしで、その他のsudoコマンドは一度認証すれば30分間有効。 これなら、利便性と安全性の間でかなり良いバランスが取れているのではないでしょうか。 手間を減らすのは良いことですが、その代償として不安が増えるのは避けたいものですからね。 ## まとめ sudoのパスワード入力をなくすのは難しくありません。 上記の解説は長くなりましたが、簡単に要約すると、 1. `visudo`を使って`/etc/sudoers.d/`の下に別途設定ファイルを作成します。 ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` 2. `NOPASSWD`ルールを追加します。 ```ini Defaults timestamp_timeout=30 potter ALL=(ALL) NOPASSWD: \ /usr/bin/apt, \ /usr/bin/apt-get, \ /usr/sbin/reboot ``` どこまでパスワードを省略するかは個人の判断ですが、これだけは覚えておいてほしいと思います。 > 指先の快適さと心の快適さが同時に満たされてこそ、真の快適さと言えるでしょう。