やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

visudoでsudoersを変更して、sudo権限を設定する

zabbixユーザーとsudo等々の権限周りでハマりました。

備忘録として開発環境で動作確認したのを残しておきます。

環境

MacOS High Sierra 10.13.1
Vagrant 2.0.1
CentOS 7.2.1511

かんたんなsudoersの知識

sudoとかの権限を設定しているのは、
/etc/sudoersというファイルです。
ちなみに/etcの下にsudoのつくファイルは以下でした。
$ ls -l /etc/ | grep sudo

-rw-r-----.  1 root root   1786 Sep 25  2012 sudo.conf
-r--r-----   1 root root   4191 Jan 16 17:27 sudoers
drwxr-x---.  2 root root     20 Jan 27  2016 sudoers.d
-rw-r-----.  1 root root   3181 Jul 25  2013 sudo-ldap.conf

よく見ると、sudoersは440で書き込みできませんね。
普通には書き込みができないのがこのsudoersファイルです。
普通に書き込みしてしまって、シンタックスエラーがある状態で保存してしまうと、二度とrootを使えなくなったりする危険なファイルです。
なので、sudoersを編集する際にはシンタックスチェックをする、安全なvisudoというコマンドを使って編集をしていきます。

一般ユーザーを作成します

rootになっておく
$ sudo su -

まずは、現在のユーザー一覧を確認
$ ls -l /home/

合計 2
drwx------. 5 vagrant   vagrant   4096  1月 12 10:52 vagrant

vagrantユーザーだけでした。

userを追加
$ useradd test-user

ユーザー追加されたのを確認
$ ll /home

total 0
drwx------  2 test-user test-user 59 Jan 16 17:01 test-user
drwx------. 3 vagrant   vagrant   90 Jan 27  2016 vagrant

test-userが作成されました。

test-userのパスワードを設定(一応)
$ passwd test-user

Changing password for user test-user.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

パスワード設定完了。

権限確認

test-userにログイン
$ su test-user
$ whoami
test-user
test-userにログインできました。

sudoが必要なコマンドを実行してみます
$ yum install -y git

Loaded plugins: fastestmirror
You need to be root to perform this command.

rootじゃないとできないみたいですね。

sudoをつけてみます。
$ sudo yum install -y git

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for test-user:

やはり、パスワードがないとだめですね〜
これは当然ながらtest-userを作った管理者は知っていますが。。。

sudoers権限をいじります

rootに戻ります
$ exit

sudoersをいじります
$ visudo
以下の行をを一番下に追加します。
test-user ALL=(root) yum
test-userに root権限でのyumの使用を許可します。という意味です。
/bin/yumじゃなくていいのかな?
yumのオプションは何でも使えるのかな?
試しにやってみます。

編集を抜けると

visudo: >>> /etc/sudoers: syntax error near line 121 <<<
What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)

What now? 

と、
何も考えずにQをやってしまったが最後、二度とsudoを使えなくなってしまいました。
rootにログインすることも叶わなかった。。。
VM立ち上げ直した。。。

これ本番でやったら偉いことになります。
めのまえがまっくらになった!状態になります。
所持金がなくなります。
そんな事故がないために、単にviだけでは編集できず、専用のsyntaxチェックをしてくれるvisudoを使うんですね~

さて、もう一度vagranをdestroyしてupして、visudoまでの操作を行います。

$ visudo

以下のように追加
test-user ALL=(root) NOPASSWD: /bin/yum
:wqでちゃんと正常に抜けられました。

動作確認

test-userにログイン
$ su test-user

権限を確かめる
$ sudo yum install -y git
->OK!
$ sudo yum history
→正常に表示されます。
yumのコマンドなら全部使えるっぽい。
権限をもう少し絞ってみます。

権限変更

とりあえず/bin/yumが使えることがわかりました。
オプション等々、どこまでsudoersファイルで制限できるのでしょうか。
試してみます。

rootになる
$ exit

$ visudo 一番下の行を以下の設定に変更 test-user ALL=(root) NOPASSWD: /bin/yum install -y tig

test-userになる
$ su test-user

確かめる
$ sudo yum install -y tig
出来ました。

他のコマンドは使えないのか確認します。
$ sudo yum install -y tree
ダメでした。パスワードを求められてしまいます。

全部決め打ちでroot権限を与えることもできるようですね。

どこまで制限できるのか

検証してみます。
$ visudo
次のように設定
test-user ALL=(root) NOPASSWD: /bin/yum install
期待する動作は、これでyum installなら何でも使えるけど、他のyumコマンドは使えない挙動!

試してみます
$ su test-user
$ sudo yum install -y tree

なんかパスワード求められた。。。
なんかダメみたいだ。

なので、方法としては、
完全に決め打ちのコマンドを一つずつ書くか、
オプションは指定しないで、実行ファイルのパスだけを書くか。
のどちらかっぽい。
コマンドの処理の仕方とかもっと深く知れば「はいはい、そりゃそうだ」って言えるようになる気がする。
けど今は一つ一つ動作を検証してみて、こういう挙動なのだとわかりました!頑張った!

あと実はファイルパスとディレクトリの権限等のこともハマったので、次回整理してまとめておきたいです。