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 # コイツを追加
追加したら (vimの場合) :wq
で write & quit しますが、この時、設定ファイルとしてのvalidationが走り、問題なければ /etc/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
グループに属している場合、 wheel
に対する設定のほうが後に書かれているのでNOPASSWD指定が上書きされて、パスワードが要求されてしまいます。
自分が wheel
グループに属しているかどうかは id
コマンドで確認できます。
$ id uid=1000(h-shinoda) gid=100(users) groups=100(users),10(wheel)
この場合の選択肢としては、下記のようなものがあります。
wheel
グループからユーザを外すusermod
コマンドを使ってwheel
グループから外す
- 追加したNOPASSWDの設定を、sudoersの
%wheel ALL=(ALL) ALL
行以降へ移動させる