出于安全考虑,在实践中我们会通过useradd创建非root用户来进行日常操作,通过sudo实现让非root用户不需要知道root密码又可以提权到root执行操作。
一、sudo的常用配置
sudo命令如果不带-u参数则默认使用root用户,与su相比,sudo是将当前用户切换到超级用户下或切换到指定的用户下,然后以超级用户或其指定切换到的用户身份执行命令,执行完成后直接退回到当前用户。
我们通常使用如下的方式来新建用户(非交互方式创建了一个名为jumper的用户):
1 2 |
adduser --disabled-password --gecos "" jumper echo "jumper:YOUR_PLAIN_TEXT_PASSWORD" | chpasswd |
通过useradd添加的用户并不具备sudo权限,需要将其添加到/etc/sudoers文件中:
/etc/sudoers默认为只读权限,因此需要用w!保存。sudo命令在成功输入一次密码后默认15分钟内不需要再次输入,该时间可以调整。
User Privilege specification的格式为:
1 2 |
授权用户/组 主机 =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,... 字段1 字段2 =[(字段3)] [字段4] 字段5 |
其中:
1)字段3和字段4可以省略;
2)字段1不以%号开头的表示“要授权的用户”,比如例子中的root;
3)字段1以%号开头的表示“要授权的组”, 比如例子中的%admin组和%sudo组;
4)字段2表示允许登录的主机,ALL表示所有。如果该字段不为ALL,则表示授权用户只能在某些机器上登录本服务器来执行sudo命令。例如
1 |
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown |
表示普通用户jack只有在主机(或主机组)mycomputer上才可以通过sudo执行reboot和shutdown两个命令,字段3和字段4被省略了;
5)字段3如果省略则相当于(root:root),表示可以通过sudo提权到root;如果为(ALL)或(ALL:ALL)则表示能够提权到(任意用户:任意用户组)。请注意,字段3如果没省略,则必须使用双括号引起来以便于区分是省略了字段3还是字段4;
6)字段4的可能取值是
NOPASSWD:,请注意NOPASSWD后面带有冒号,表示执行sudo时可以不需要输入密码。例如:
1 |
god ALL=(ALL) NOPASSWD: /bin/useradd |
表示普通用户god可以在任何主机上、通过sudo执行/bin/useradd命令且不需要输入密码。又比如:
1 |
godness ALL=(ALL) NOPASSWD: ALL |
表示普通用户godness可以在任何主机上、通过sudo执行任何命令且不需要输入密码。需要注意NOPASSWD的命令作用域,NOPASSWD:只影响其后的第一个命令,因此:
1 |
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd |
表示用户papi能在所有主机上提权到root下执行/bin/chown而无需输入密码,但运行/usr/sbin/useradd命令时仍需输入密码.
这是因为
7)字段5是使用逗号分开一系列命令,这些命令就是授权给用户的操作,如果为ALL则表示允许所有命令。请注意,命令必须使用绝对路径以避免目录下有同名命令被执行从而造成安全隐患。此外,命令支持通配符和取反,例如:
1 |
papi ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk |
表示用户papi在所有主机上能够运行目录/usr/sbin和/sbin下所有的程序但fdisk除外。
在具有sudo操作的用户下,执行sudo -l可以查看到该用户被允许和被禁止运行的命令:
1 2 3 4 5 6 7 8 |
jumper@nginx-uat:~$ sudo -l [sudo] password for jumper: Matching Defaults entries for jumper on nginx-uat: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User jumper may run the following commands on nginx-uat: (ALL : ALL) ALL jumper@nginx-uat:~$ |
按照传统,通常会将用户加入到wheel组中:
1 |
usermod -a -G wheel <用户名> |
如果提示wheel组不存在, 则创建该组:
1 |
groupadd wheel |
二、禁止普通用户su到root用户
通常,我们会建立一个管理员组,只允许这个组的用户来执行su命令登录为root用户,而让其他组的用户即使执行su、输入了正确的root密码,也不能登录为root用户。
修改/etc/pam.d/su配置,禁止非root组的用户使用su:
按照提示修改/etc/login.defs文件:
参考资料:
1、https://blog.51cto.com/836459598/1844531
转载时请保留出处,违法转载追究到底:进城务工人员小梅 » 非root用户的sudo控制