淺談 sudoers

November 17, 2019

描述

因為在學校要做資訊安全的報告,因此對帳號提權部分做了一點研究。本篇會對於 sudoerssudo 的使用方式作介紹。主要探討的是為何在安裝 ubuntu 時,設定的使用者會有 sudo 提權的功能。

對於 sudo 的描述在先前文章有提過。

sudoers

配置檔的預設某些內容,格式為 使用者帳號 登入者的來源主機名稱=(可切換的身份) 可下達的指令

...
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
...

sudo usage

$ sudo -u [UID] ls [FILE_PATH] # 取得該 UID 的權限,並執行指令
$ sudo -g [GID] ls [FILE_PATH] # 取德該 GID 的權限,並執行指令

Example

cch 為安裝時,設定的使用者。test 則是新增的。

cch@mars:~$ id cch
uid=1000(cch) gid=1000(cch) groups=1000(cch),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
cch@mars:~$ id test
uid=1001(test) gid=1001(test) groups=1001(test)

先用 su 做使用者登入切換

$ su -l test
Password:
test@mars:~$

例如我們用 test 使用者查看 syslog

test@mars:~$ head -n 1 /var/log/syslog
head: cannot open '/var/log/syslog' for reading: Permission denied
test@mars:~$ ls -l /var/log/syslog 
-rw-r----- 1 syslog adm 392736 Nov 17 01:46 /var/log/syslog

出現以下訊息,簡單來說就是無權限,因此要至 sudoers 配置

test@mars:~$ sudo head -n 1 /var/log/syslog
[sudo] password for test:
test is not in the sudoers file.  This incident will be reported.
test@mars:~$ sudo cat /var/log/syslog
[sudo] password for test:
test is not in the sudoers file.  This incident will be reported.

解決方式 1,在 sudoers 中添加

$ test ALL=(cch) ALL 

在執行一次

$ sudo  head -n1 /var/log/syslog
Sorry, user test is not allowed to execute '/usr/bin/head -n1 /var/log/syslog' as root on mars.

但我們在 suoderstest 可以切換 cch。因此下達 -u cch 的參數即可成功

$ sudo -u cch head -n1 /var/log/syslog
[sudo] password for test:
Nov 12 00:56:39 mars kernel: [    0.000000] Linux version 4.15.0-66-generic (buildd@lgw01-amd64-044) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 (Ubuntu 4.15.0-66.75-generic 4.15.18)

解決方式二,加至 sudo GID

cch@mars:~$ sudo addgroup test sudo
Adding user `test' to group `sudo' ...
Adding user test to group sudo
Done.
cch@mars:~$ id test
uid=1001(test) gid=1001(test) groups=1001(test),27(sudo)

執行結果

test@mars:~$ sudo  head -n1 /var/log/syslog
[sudo] password for test:
Nov 12 00:56:39 mars kernel: [    0.000000] Linux version 4.15.0-66-generic (buildd@lgw01-amd64-044) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 (Ubuntu 4.15.0-66.75-generic 4.15.18)

解決方式三,先在 sudoers 定義以下

$ test ALL=(ALL:ALL) ALL 

不在 adm 群組和 syslog 使用者下,透過上述設定,並藉由 sudo 提權 adm 群組或 syslog 使用者權限。

$ sudo -g adm head -n1 /var/log/syslog
Nov 12 00:56:39 mars kernel: [    0.000000] Linux version 4.15.0-66-generic (buildd@lgw01-amd64-044) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 (Ubuntu 4.15.0-66.75-generic 4.15.18)
test@mars:~$ id test
uid=1001(test) gid=1001(test) groups=1001(test)
test@mars:~$ sudo -u syslog head -n1 /var/log/syslog
Nov 12 00:56:39 mars kernel: [    0.000000] Linux version 4.15.0-66-generic (buildd@lgw01-amd64-044) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 (Ubuntu 4.15.0-66.75-generic 4.15.18)

結論

從上述的結果來看 cch 使用者因為有再 sudo GID,因此可以用 sudo 做提權。那 test 使用者則是要透過指令將 sudo GID 加至 test 或者可針對可予以切換的使用者或群組作設定,讓該 test 透過 sudo -usudo -g 做權限切換動作。

sudoers 是一個可針對使用者能做的事情做限制,善加利用的話也可以達到安全防護效果。