3-4-2-1-a sudo の注意点

estis2017/02/20 (月) 13:11 に投稿

vi などエディタコマンドを許可していると、他のコマンドも許可したユーザー権限で実行される危険がある。

一般ユーザーでは、/root/ の中が見えない。

$ ls /root/
ls: cannot open directory /root/: 許可がありません

このユーザーは、/bin/vi だけ、sudo できる。

$ sudo -l
[sudo] password for sum: 
このホスト上でユーザー sum に一致したデフォルト項目:
    !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME
    LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

ユーザー sum は次のコマンドをこのホスト上で実行できます:
    (ALL) /bin/vi

なので当然、sudo でも実行できない。

$ sudo ls /root/
ユーザー sum は'/bin/ls /root/' を root として localhost.localdomain 上で実行することは許可されていません。すみません。

しかし、

$ sudo vi

と、viを起動し、

:!ls /root/

を実行すると、

GHOST  GHOST.c	Git  anaconda-ks.cfg  awk  dstat.log  install.log  install.log.syslog  nltk_data  setuptools-5.2.zip  sh  tmp  tmp00  tmp02  work  wpscan

Press ENTER or type command to continue

のように、実行できてしまう。

これを回避するには、vi を許可せず、sudoedit を許可する。

$ sudoedit FILENAME

または、

$ sudo -e FILENAME

と実行できる。

man sudo から関連部分

       -e          -e (edit) オプションを指定するのは、ユーザーがコマンドの実行ではなく、一つ以上のファイルの編集を望んでいるということである。 sudoers ファイルの参照では、コマンドとして文字列 "sudoedit" が使用される。 sudoers ファイルによってユーザに
                   権限があることが認められると、次のようなことが順番に行われる。

                   1.  編集対象のファイルのコピーをテンポラリファイルとして作成する。テンポラリファイルのオーナーは sudo を起動したユーザである。

                   2.  環境変数 SUDO_EDITOR, VISUAL, EDITOR のいづれかで指定されたエディタを起動して、テンポラリファイルを編集する。 SUDO_EDITOR, VISUAL, EDITOR のいづれも設定されていないときは、 sudoers ファイルの editor 変数にリストされた最初のプログ
                       ラムが使用される。

                   3.  編集作業がすむと、テンポラリファイルをオリジナルのファイルに書き戻して、テンポラリファイルを消去する。

                   指定されたファイルが存在しない場合は作成する。ここで注意すべきは、 sudo によって実行されるコマンドの大部分と違って、 -e でエディタが実行されるときは、sudo を起動したユーザの環境が、変更を受けずにそのまま使われるということである。何ら
                   かの理由で sudo が編集した内容でファイルを更新できないときは、ユーザに警告を発し、編集した内容をテンポラリファイルに保持することになる。