hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

sudoコマンドの使い方

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技術ブログ