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 が編集した内容でファイルを更新できないときは、ユーザに警告を発し、編集した内容をテンポラリファイルに保持することになる。