Linuxでsudoコマンドをパスワードなしで使う

sudo apt update sudo systemctl restart nginx sudo reboot

Linuxを使っていると、sudoコマンドを頻繁に使うことになります。しかし、毎回パスワードを入力するのはだんだん面倒になってきますよね。

その面倒さがピークに達すると、結局、sudoのパスワード入力を省略する設定に手を出したくなるものです。この記事にたどり着いた皆さんも、きっと私と同じような気持ちになっていることでしょう。

この記事では、sudoコマンドのパスワード入力をなくす方法をまとめます。

Tuxと鍵で表現されたLinuxのセキュリティ

sudoの設定はどこにある?そして修正方法は?

sudoの設定ファイルはここにあります。

/etc/sudoers

sudoの設定は、文法が間違っていると非常に困ったことになります。設定を誤ってsudo自体が使えなくなると、復旧が面倒です。そのため、専用コマンドであるvisudoを使います。

sudo visudo

visudoは保存時に文法チェックを行い、誤字があればすぐに教えてくれます。公式マニュアルでも、必ずvisudoを使うようにと記載されています。

ただし、/etc/sudoersを直接編集するのは避けよう

sudo visudoと入力すると、すぐに/etc/sudoersが開かれ、直接編集することができます。しかし、/etc/sudoersファイルを直接開いて編集するのはあまり良い習慣ではありません。

私は通常、メインの設定ファイルには手を触れず、/etc/sudoers.d/ディレクトリに新しいファイルを生成しておくことを推奨します。

こうすることで、後で何を変更したかが見つけやすく、元に戻すのも簡単です。

sudoは、追加設定を以下のディレクトリ内のファイルからインクルードするように設計されています。

実際に/etc/sudoersファイルの最終行には、include /etc/sudoers.d/という記述が見られます。

sudo visudo -f /etc/sudoers.d/no-password-common-commands

ファイル名は自由に、後で分かりやすいように作成すれば大丈夫です。

ただし、あまり適当な名前をつけない方が良いでしょう。後で自分自身が困ることになります。

ああ!ちなみに、~.を含むファイル名はsudoersが無視するとされています。ディレクトリ内のREADMEファイルに、そのような内容を案内するコメントがありました。

設定形式を知ろう

sudoersの設定はだいたいこのような形式です。

本当に...覚えられる文法ではありません。どこかにメモするか、このブログページをお気に入りに入れておきましょう。頻繁に使うわけではありませんが、たまに使おうとすると忘れてしまいます。

ユーザー名 ホスト=(実行ユーザー) オプション: コマンド

例えば、ユーザー名がpotterで、apt updateをパスワードなしで実行したい場合は、このように記述できます。

potter ALL=(ALL) NOPASSWD: /usr/bin/apt

各部分を分解すると以下のようになります。

  • potter : 設定を適用するユーザー名。
  • ALL : すべてのホストで適用する。
  • (ALL) : どのユーザー権限で実行できるかを意味します。時々(root)と書いている人も見かけましたが、私はALLにしています。
  • NOPASSWD: パスワードを尋ねない。
  • /usr/bin/apt : 許可するコマンドの「絶対パス」です。

コマンドのパスがわからない場合は、whichで確認できます。

~$which apt
/usr/bin/apt

~$which apt-get
/usr/bin/apt-get

~$which reboot
/usr/sbin/reboot

~$which systemctl
/usr/bin/systemctl

ALLですべて許可したくなる誘惑

ここで非常に強い誘惑が訪れます。

potter ALL=(ALL) NOPASSWD: ALL

非常にすっきりしています。すべてのsudoコマンドをパスワードなしで実行できます。便利ですよね。とても便利です。

個人の選択ですが、これは我慢する方が良いと私は考えます。誤って入力したコマンド一つが、すぐにroot権限で実行されてしまう状況は想像したくありません。

スクリプトが意図しない動作をしても、パスワード入力という最後のブレーキがありません。

ターミナルを一時的に開いた状態で誰かに触られても、そのまま実行されてしまいます。世の中には変な人が多いですからね...

選択は皆さん次第です。

よく使うコマンドだけパスワードなしで許可する

私は「よく使うものだけ許可する」という方針で妥協しています。この方法はかなり良いと思います。

例えば、aptapt-getrebootsystemctl程度だけパスワードなしで使いたいとしましょう。

まず、設定ファイルを開きます。

sudo visudo -f /etc/sudoers.d/no-password-common-commands

以下のように記述します。

potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot, /usr/bin/systemctl

これでpotterさんは、以下のコマンドをパスワードなしで実行できます。

sudo apt update
sudo apt -y upgrade
sudo apt-get update
sudo reboot
sudo systemctl reload nginx

systemctlすべてを許可するのが気になる場合は、特定のコマンドだけを許可することもできます。

potter ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx

複数行に分けて書くと読みやすい

コマンドが多くなると1行が長くなり、見づらくなります。このような場合は、\で改行することができます。

Linuxユーザーにはお馴染みの改行方法ですが、不思議と実際にやろうとすると\をあまり使わないことがあります。

しかし、やはり使うと可読性が向上します。

potter ALL=(ALL) NOPASSWD: \
    /usr/bin/apt, \
    /usr/bin/apt-get, \
    /usr/sbin/reboot, \
    /usr/bin/systemctl

見た目も良く、すっきりしましたね。

特定のグループに適用する

この設定も非常に便利です。複数人で管理するサーバーでは、グループ単位で管理する方が便利な場合があります。

特定のグループにのみ適用したい場合は、%グループ名の形式で記述します。

例えば、adminグループであればこのようになります。

%admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt, /usr/bin/apt-get

パスワード入力の有効時間を延長する

パスワードを完全に無くすのは少し抵抗があるという場合は、別の方法もあります。それは、パスワードを再度尋ねるまでの時間を調整することです。

基本的に、一度パスワードを入力すると10分か15分程度は再入力が不要になりますが、この時間を調整できます。

timestamp_timeout設定を利用する方法です。

例えば、このように設定すると60分間sudoパスワードを再入力する必要がなくなります。

Defaults timestamp_timeout=60

単位は「分」ですが、「0」を設定すると常にパスワードを入力しなければならない悪夢になります。

「-1」に設定すると、一度入力したsudoパスワードはターミナルを閉じるまで再入力が不要になります。これはALLに匹敵する強力な利便性ですが、使用には多少の懸念も伴います。

もちろん、パスワードなしで許可する設定と、有効時間を延長する設定は共存可能です。

例えば、このように組み合わせることができます。

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/の下に別途設定ファイルを作成します。
sudo visudo -f /etc/sudoers.d/no-password-common-commands
  1. NOPASSWDルールを追加します。
Defaults timestamp_timeout=30

potter ALL=(ALL) NOPASSWD: \
    /usr/bin/apt, \
    /usr/bin/apt-get, \
    /usr/sbin/reboot

どこまでパスワードを省略するかは個人の判断ですが、これだけは覚えておいてほしいと思います。

指先の快適さと心の快適さが同時に満たされてこそ、真の快適さと言えるでしょう。