カレーとナン
unix系OSには任意のユーザとしてコマンドを実行する sudo というコマンドがあります。
Linuxコマンド集 – 【 sudo 】指定したユーザーでコマンドを実行する:ITpro
このコマンドは、一般ユーザでログインした状態でroot権限でコマンドを実行したいときに良く使われますが、デフォルトだと下記のようにユーザのパスワードを要求されます。
$ sudo whoami
[sudo] password for h-shinoda:
root # rootユーザとして実行されている
プロビジョニング時など、何度もsudoを叩く必要があるときに都度パスワードを要求されるとキレそうになりますが、下記のように設定をすることによってパスワードを要求させないように出来ます。
注意
パスワードが要求されない = その一般ユーザアカウントがハックされる = rootが乗っ取られると同義なので、リスクを承知のうえで行って下さい。
方法
誰がどのようにsudo出来るかという情報は /etc/sudoers というファイルで管理されています。が、このファイルを決して手動で編集してはいけません。
今回やろうとしている変更としては、「特定のユーザに対して、パスワードなしで(すべてのコマンドを)sudoできるようにする」というものですので、ユーザ名を h-shinoda とすると、追加する設定としては下記のようになります。
h-shinoda ALL=(ALL) NOPASSWD: ALL
上記を visudo コマンドを使って /etc/sudoers へ設定します
$ sudo visudo
90行目辺りのrootユーザに対する設定の直下辺りにでも追加します。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
h-shinoda ALL=(ALL) NOPASSWD: ALL # コイツを追加
追加したら :wq で write & quit しますが、この時、設定ファイルとしてのverifyが走り、問題なければsudoersへ変更が適用されます。
ここまで設定できれば、sudoでパスワードを要求されることはありません。
$ sudo whoami
root
おつかれさまでした!
補足
補足1: どうして手動で /etc/sudoers を編集してはいけないのか
sudoコマンドを実行するたびにsudoersファイルが読まれるため、変更は即時反映されます。
つまり、誤った設定や構文エラーなどで一度設定を壊してしまうとそれ以降sudoコマンドが使えなくなります。
インターネットへ公開されているサーバの場合、セキュリティ的に普通はrootによるssh接続を禁止していると思うので、その状況でsudoが使えないとなると…
考えるだけでもゾクゾクしますね!(遠い目)
補足2: 実際には /etc/sudoers はあまりイジらない
一つのファイルにいろんな設定を書くと、可読性が下がってしまいます。
じゃあどうするでいうと /etc/sudoers.d 下に、ユーザごとに設定ファイルを持つことが多いと思います。
その場合、visudoコマンドの-fオプションでファイル名を指定します。
$ sudo visudo -f /etc/sudoers.d/h-shinoda
補足3: visudoで誤った設定を保存してしまった場合
問題があれば下記のようにでます。
$ sudo visudo
visudo: >>> /etc/sudoers: syntax error near line 92 <<<
What now?
この時の選択肢としては、下記の3つがあります。
- e: 再編集する (再度vimが開き、問題点を直す)
- x: sudoersを変更をせずに終了する
- q: 構わずsudoersを変更をして終了する (DANGER!)
補足4: アレェ?設定したのにパスワードが要求される…
ユーザが wheel グループに属している場合、NOPASSWD指定が上書きされてパスワードが要求されます。
自分が wheel グループに属しているかどうかは id コマンドで確認できます。
$ id
uid=1000(h-shinoda) gid=100(users) groups=100(users),10(wheel)
この場合の選択肢としては、下記のようなものがあります。
wheelグループからユーザを外すusermodコマンドを使う
- 追加したNOPASSWDの設定を、sudoersの
%wheel ALL=(ALL) ALL行以降へ移動させる- 上から最後まで設定を舐めて、最後にmatchする設定が適用されるため