10.3. 非特権ユーザーが特定のコマンドを実行できるようにする
管理者は、/etc/sudoers.d/
ディレクトリーにポリシーを設定することで、非特権ユーザーが特定のワークステーションに特定のコマンドを入力できるようにすることができます。これを行うと、ユーザーに完全な sudo
アクセス権を付与したり、ユーザーに root パスワードを付与したりするよりも、セキュリティーが向上します。その理由は次のとおりです。
- 特権を必要とする操作のより細かい制御。ユーザーに完全な管理アクセス権を付与せずに、特定のホストで特定の操作を実行することを許可できます。
-
ロギングの改善。ユーザーが
sudo
を通じて操作を実行したときに、その操作が root だけでなくユーザー名とともにログに記録されます。 -
透明性のある制御。ユーザーが
sudo
権限の使用を試みるたびにメール通知を送信するように設定できます。
前提条件
- システムへの root アクセス権があります。
手順
root で、
/etc/
の下に新しいsudoers.d
ディレクトリーを作成します。# mkdir -p /etc/sudoers.d/
/etc/sudoers.d
ディレクトリーに新規ファイルを作成します。# visudo -f /etc/sudoers.d/<filename>
ファイルが自動的に開きます。
次の行を
/etc/sudoers.d/<filename>
ファイルに追加します。<username> <hostname.example.com> = (<run_as_user>:<run_as_group>) <path/to/command>
-
<username>
は、ユーザー名に置き換えます。 -
<hostname.example.com>
は、ホストの URL に置き換えます。 -
(<run_as_user>:<run_as_group>)
は、コマンドを実行できるユーザーまたはグループに置き換えます。このセクションを省略すると、<username>
は root としてコマンドを実行できます。 -
<path/to/command>
は、コマンドへの完全な絶対パスに置き換えます。また、コマンドパスの後にオプションを追加することにより、特定のオプションおよび引数を指定したコマンドのみを実行するようにユーザーを制限することもできます。オプションを指定しないと、すべてのオプションが有効な状態でコマンドを使用できます。 同じホストで 2 つ以上のコマンドを 1 行で許可するには、コンマで区切り、コンマの後にスペースを付けることができます。
たとえば、
user1
がhost1.example.com
でdnf
およびreboot
コマンドを実行できるようにするには、user1 host1.example.com = /bin/dnf, /sbin/reboot
と入力します。
-
オプション: ユーザーが
sudo
特権の使用を試みるたびにメール通知を受け取るには、以下の行をファイルに追加します。Defaults mail_always Defaults mailto="<email@example.com>"
- 変更を保存し、エディターを終了します。
検証
ユーザーが
sudo
特権でコマンドを実行できるかどうかを確認するには、アカウントを切り替えます。# su <username> -
ユーザーとして、
sudo
コマンドを使用してコマンドを入力します。$ sudo <command> [sudo] password for
<username>
:ユーザーの
sudo
パスワードを入力します。特権が正しく設定されている場合、システムはコマンドとオプションのリストを表示します。たとえば、
dnf
コマンドを使用すると、次の出力が表示されます。... usage: dnf [options] COMMAND ...
システムが
<username> is not in the sudoers file. This incident will be reported
というエラーメッセージを返した場合、/etc/sudoers.d/
に<username>
のファイルが存在しません。システムが
<username> is not allowed to run sudo on <host.example.com>
というエラーメッセージを返した場合、設定が正しく完了していません。root としてログインしていること、および設定が正しく実行されていることを確認してください。システムが
Sorry, user <username> is not allowed to execute '<path/to/command>' as root on <host.example.com>.
というエラーメッセージを返した場合、コマンドがユーザーのルールで正しく定義されていません。
関連情報
-
sudo(8)
、visudo(8)
、およびsudoers(5)
の man ページ