- 1 sudoコマンドとは?
- 2 検証環境
- 3 事前準備
- 4 sudoersファイルの書式
- 5 特定ユーザに全てのコマンドの実行を許可する方法
- 6 パスワード入力を要求しないようにする方法(NOPASSWD)
- 7 特定コマンドの実行を許可する方法
- 8 グループに対してコマンドの実行を許可する方法
- 9 エイリアス
- 10 ログの保存場所
- Z 参考情報
1 sudoコマンドとは?
現在ログインしている利用者が別の利用者(特に特権ユーザー)の権限でプログラムを実行するためのコマンドです。
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
3 事前準備
テスト用のユーザを作成します。なお、useraddコマンド使い方は、useradd/groupaddコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server ~]# useradd test1
作成したユーザのパスワードを設定します。
[root@server ~]# passwd test1 ユーザー test1 のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。
作成したユーザを確認します。test1が作成されたことがわかります。
[root@server ~]# id test1 uid=1000(test1) gid=1000(test1) groups=1000(test1)
4 sudoersファイルの書式
sudoersファイルは/etc/sudoers.d配下に作成します。書式は以下になります。
ユーザに対して実行可能なコマンドを定義する場合は以下の書式になります。
ユーザ名 ホスト名=(実行ユーザ名) コマンド1,コマンド2,...
グループに対して実行可能なコマンドを定義する場合は以下の書式になります。
%グループ名 ホスト名=(実行ユーザ名) コマンド1,コマンド2,...
下記定義は、「test1ユーザは、全てのホスト(ALL)で、root権限でcatコマンドを実行できる」と解釈します。
[root@server ~]# cat /etc/sudoers.d/test1 test1 ALL=(root) /usr/bin/cat
5 特定ユーザに全てのコマンドの実行を許可する方法
test1ユーザに対して、全てのコマンドの実行を許可してみます。
[root@server ~]# visudo -f /etc/sudoers.d/test test1 ALL=(ALL) ALL
設定内容を確認します。
[root@server ~]# cat /etc/sudoers.d/test test1 ALL=(ALL) ALL
test1ユーザに切り替えます。
[root@server ~]# su - test1
tcpdumpコマンドを実行します。パスワードを入力すると、tcpdumpコマンドが実行できることがわかります。
[test1@server ~]$ sudo tcpdump -i eth0 icmp あなたはシステム管理者から通常の講習を受けたはずです。 これは通常、以下の3点に要約されます: #1) 他人のプライバシーを尊重すること。 #2) タイプする前に考えること。 #3) 大いなる力には大いなる責任が伴うこと。 [sudo] test1 のパスワード: tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
6 パスワード入力を要求しないようにする方法(NOPASSWD)
test1ユーザに対して、全てのコマンドの実行を許可してみます。このとき、パスワードの入力を求められないようにします。
[root@server ~]# visudo -f /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:ALL
登録した設定内容を確認します。
[root@server ~]# cat /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:ALL
test1ユーザに切り替えます。
[root@server ~]# su - test1 最終ログイン: 2022/05/22 (日) 21:35:37 JST日時 pts/0
tcpdumpコマンドを実行します。パスワードの入力を求められることなく、tcpdumpコマンドが実行できることがわかります。
[test1@server ~]$ sudo tcpdump -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
7 特定コマンドの実行を許可する方法
7.1 単一コマンドの実行を許可する方法
test1ユーザがtcpdumpコマンドだけを実行できるようにしてみます。
[root@server ~]# visudo -f /etc/sudoers.d/test [root@server ~]# cat /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:/usr/sbin/tcpdump
test1ユーザに切り替えます。
[root@server ~]# su - test1 最終ログイン: 2022/05/22 (日) 21:39:04 JST日時 pts/0
- tcpdumpコマンドを実行した場合
test1ユーザは、tcpdumpコマンドを実行できることがわかります。
[test1@server ~]$ sudo tcpdump -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
- useraddコマンドを実行した場合
test1ユーザは、useraddコマンドを実行できないことがわかります。
[test1@server ~]$ sudo useradd test2 [sudo] test1 のパスワード: 残念、また試してください。 [sudo] test1 のパスワード: 残念ですが、ユーザー test1 は'/sbin/useradd test2' を root として server 上で実行することは許可されていません。
7.2 複数コマンドの実行を許可する方法
test1ユーザがtcpdump、useraddコマンドを実行できるようにしてみます。
[root@server ~]# visudo -f /etc/sudoers.d/test [root@server ~]# cat /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:/usr/sbin/tcpdump,/usr/sbin/useradd
test1ユーザに切り替えます。
[root@server ~]# su - test1 最終ログイン: 2022/05/22 (日) 21:41:10 JST日時 pts/0
test1ユーザの権限でtcpdumpコマンドが実行できることがわかります。
[test1@server ~]$ sudo tcpdump -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
test1ユーザの権限でuseradd コマンドが実行できることがわかります。
[test1@server ~]$ sudo useradd test2 [test1@server ~]$
8 グループに対してコマンドの実行を許可する方法
test1,test2ユーザを作成します。それぞれがtestというプライマリグループに所属するようにします。そして、testグループに対してtcpdumpの実行を許可してみます。
8.1 事前準備
testグループを作成します。なお、groupaddコマンド使い方は、useradd/groupaddコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server ~]# groupadd test
test1,test2ユーザを作成します。
[root@server ~]# useradd test1 [root@server ~]# useradd test2
test1,test2ユーザをプライマリグループに所属するようにします。
[root@server ~]# usermod -g test test1 [root@server ~]# usermod -g test test2
test1,test2ユーザがtestグループに所属していることがわかります。
[root@server ~]# id test1 uid=1000(test1) gid=1000(test) groups=1000(test) [root@server ~]# id test2 uid=1001(test2) gid=1000(test) groups=1000(test)
8.2 実行結果
testグループに所属するユーザがtcpdumpコマンドを実行できるようにします。
[root@server ~]# visudo -f /etc/sudoers.d/test [root@server ~]# cat /etc/sudoers.d/test %test ALL=(ALL) NOPASSWD:/usr/sbin/tcpdump
test1ユーザに切り替えます。
[root@server ~]# su - test1
test1ユーザ権限でtcpdumpコマンドが実行できることがわかります。
[test1@server ~]$ sudo tcpdump -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
test2ユーザに切り替えます。
[root@server ~]# su - test2
test2ユーザ権限でtcpdumpコマンドが実行できることがわかります。
[test2@server ~]$ sudo tcpdump -i eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
9 エイリアス
エイリアスは、定義ファイルを簡潔に記述するためのものです。/etc/sudoersに登録されていて、ホスト、ユーザ、コマンド用のものがあります。それぞれ、Host_Alias,User_Alias,Cmnd_Aliasを用いて定義します。また、エイリアスを自身で定義することもできます。
9.1 コマンドエイリアスの種類
エイリアス名 | エイリアスに含まれるコマンド |
---|---|
NETWORKING | route,ifconfig,ping,dhclient,net,iptables, rfcomm,wvdial,iwconfig,mii-tool |
SOFTWARE | rpm,up2date,yum |
SERVICES | service,chkconfig,systemctl start,stop等 |
LOCATE | updatedb |
STORAGE | fdisk,sfdisk,parted,partprobe,mount,umount |
DELEGATING | visudo,chown,chmod,chgrp |
PROCESSES | nice,kill,killall |
DRIVERS | modprobe |
9.2 実行結果
ここでは、SOFTWAREエイリアスを使ってみます。SOFTWAREエイリアスを有効にすることで、rpm,yum,up2dateを個々に定義する必要がなくなります。
visudoコマンドを実行して、/etc/sudoersのSOFTWAREを有効('#'を削除する)にします。
[root@server ~]# visudo ## Installation and management of software # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
test1ユーザがSOFTWAREエイリアスを実行できるようにしてみます。
[root@server ~]# visudo -f /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:SOFTWARE
設定内容を確認します。test1ユーザが、パスワードなしでSOFTWAREエイリアスを実行できることがわかります。
[root@server ~]# cat /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:SOFTWARE
test1ユーザに切り替えます。
[root@server ~]# su - test1
ユーザtest1の権限でbcパッケージをインストールできることがわかります。
[test1@server ~]$ sudo yum -y install bc
10 ログの保存場所
sudoコマンドの実行結果は、/var/log/secureに保存されます。
test1ユーザに対して、全てのコマンドの実行を許可してみます。このとき、パスワードの入力を求められないようにします。
[root@server ~]# cat /etc/sudoers.d/test test1 ALL=(ALL) NOPASSWD:ALL
test1ユーザに切り替えます。
[root@server ~]# su - test1
test1ユーザ権限でtcpdumpコマンドを実行します。
[test1@server ~]$ sudo tcpdump -i eth0 icmp
test1ユーザがtcpdumpコマンドを実行すると、以下のメッセージがログに記録されます。
[root@server ~]# tail -f /var/log/secure May 23 20:05:22 server sudo: test1 : TTY=pts/0 ; PWD=/home/test1 ; USER=root ; COMMAND=/sbin/tcpdump -i eth0 icmp
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ