Linux系统sudo命令的便捷设置

neevop 十月 28, 2022

Linux sudo工具配置

sudo 简介

如果您在任何 Linux 命令前加上“sudo”前缀,它将以提升的权限运行该命令。执行某些管理任务需要提升的权限。Sudo 是提升权限的最佳和最安全的方法。安装sudo可以通过

# su
$ apt-get install sudo -y  # for ubuntu or debian

系统新建用户后,一般是不具备sudo命令的使用权限的,需要手动将当前用户添加sudo用户组

  1. 切换root用户或者任意具有sudo命令权限的用户,

  2. 将新建用户添加sudo用户组。

    $ sudo adduser username sudo
    # for centos
    $ sudo usermod -aG wheel username  # 在centos中wheel用户组所有成员默认被授予sudo使用权限
    

visudo操作

/etc/sudoers这个文件是 sudo 的下层。它控制谁可以使用 sudo 命令获得提升的权限。正常情况下这个文件有写保护,哪怕是root用户也不可修改这个文件。

$ ll /etc/sudoers
-r--r-----. 1 root root 4038 Aug  2 02:01 /etc/sudoers

可以看到这个文件的权限是0440,就算是所属用户都只有读权限。如果需要修改这个文件就需要先修改这个文件的权限

# su
$ chmod 640 /etc/sudoers

操作后,所属用户root便拥有的写入文件的权限。但是个人并不建议这种方式直接操作/etc/sudoers文件,一旦文件内容修改错误,sudo命令就无法正常使用,对于一些图形界面引导安装的linux系统,由于没有设置root用户密码,这个失误将是毁灭性的。出现这种状况后,可以考虑使用ubuntu系统引导盘进入引导系统,重新修正系统硬盘上的/etc/sudoers文件。

编辑此文件的最佳和最安全的方法是使用visudo命令。此命令将以提升的权限启动vi 编辑器,以便您可以编辑文件并保存它。它还将在 sudoers 文件上放置一个文件锁,以便其他人无法编辑它。 完成编辑后,它将解析文件以查找简单错误。与使用任何旧的文本编辑器相比,这是一种编辑 sudo 文件的更安全的方法。

编辑/etc/sudoers文件以便于我们可以方便的定制sudo命令的使用规则。以下是两种常用的定制

  • 给特定用户组或用户添加sudo权限运行特定命令。

    ## Allows people in group wheel/sudo to run all commands
    %wheel  ALL=(ALL)       ALL  # for centos
    %sudo   ALL=(ALL:ALL) ALL    # for debian/ubuntu
    
    ## Allows members of the users group to shutdown this system
    # %users  localhost=/sbin/shutdown -h now
    
    ## Allow root to run any commands anywhere
    root    ALL=(ALL)       ALL
    

    以上是系统的默认设置,可以按照提示添加特定的定制内容。

  • 设置单个用户sudo命令无密码,这个定制会极大方便用户和脚本使用sudo命令。

    myuser ALL=(ALL:ALL) NOPASSWD: ALL
    # or
    myuser ALL=(ALL) NOPASSWD: ALL
    

    这个定制内容如果是在公网服务器上会有较大的安全隐患,我们也可以定制部分命令无密码来降低风险。

    myuser  ALL=(www-data:www-data) NOPASSWD: ALL
    myuser  ALL= NOPASSWD: /bin/mkdir
    

在执行visudo命令设置我们需要的内容时,会注意到在/etc/sudoers文件末尾有行配置

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

也就是说我们可以定制属于自己的配置文件单独存放在/etc/sudoers.d 路径下,而不用去修改/etc/sudoers文件里面的默认配置。可以通过如下命令实现

$ sudo visudo -f /etc/sudoers.d/myOverrides 

由于sudo命令配置内容是施行"最后一条规则优先"的规则,所以你在/etc/sudoers.d 里面的配置内容会覆盖/etc/sudoers里面的配置内容。也正是因为有这个规则的存在,所以有些直接修改/etc/sudoers的操作并不会生效。例如

...
# User privilege specification
root    ALL=(ALL:ALL) ALL
myuser ALL=(ALL:ALL) NOPASSWD: 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
...

如果你按照文章开头位置老实将myuser用户添加了adminsudo用户组,这里就会出现myuser ALL=(ALL:ALL) NOPASSWD: ALL无法生效的问题。是因为这里对用户的配置被后面的对sudoadmin用户组的配置覆盖了,导致NOPASSWD的配置无法生效。

$ groups
adm cdrom sudo dip plugdev lpadmin sambashare

因此在完成对单个用户的配置后可以检查该用户的权限是否符合自己的要求。

$ sudo -l
User myuser may run the following commands on host:
    (ALL : ALL) NOPASSWD: ALL
    (ALL : ALL) ALL

上面所说的这种情况,只需要将自己的配置挪到配置文件的末尾或者上文中新的文件里即可

...
# 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

myuser ALL=(ALL:ALL) NOPASSWD: ALL
...

重新查看用户的sudo权限配置

$ sudo -l
User myuser may run the following commands on host:
    (ALL : ALL) ALL
    (ALL : ALL) NOPASSWD: ALL

sudo命令

sudo –b 将在后台运行该命令。这对于在运行时显示大量输出的命令很有用。

sudo –s 将以提升的权限运行指定的 shell,给你 # 提示符(不要忘记退出!)。

sudo su – 将使您成为 root 用户并加载您的自定义用户环境变量。

参考文献

https://askubuntu.com/questions/504652/adding-nopasswd-in-etc-sudoers-doesnt-work

https://acloudguru.com/blog/engineering/linux-commands-for-beginners-sudo#:~:text=Sudo%2C%20the%20one%20command%20to,given%20%E2%80%9CAccess%20Denied%3F%E2%80%9D.