一、Linux sudo
Linux sudo就是用于定义某个用户能够以另外一个用户的身份通过哪些主机执行某些命令。
在Linux的用户除了root就是普通用户、而且普通用户的权限非常低,就连向系统中安装软件的权限都没有。很多时候系统管理员为了能让普通用户具备一点root的特权,省得用户经常来麻烦他们,此时就可以赋予用户被称为root的特权。
如果你是使用centos系统那么普通用户就没有具备sudo特权。对于桌面版的Linux发行版,比如ubuntu、fedora等;他们的设计理念是个人日常应用、比较偏向赋予普通用户相对较为宽泛的权利;所以在系统的配置中会有一类基于普通用户的管理员角色,这类角色的用户会被赋予sudo权利。所以如果你算账选择的是这类发行版,那么你在系统安装阶段所添加的用户基本都是具备sudo特权、而对于centos系统这类企业级发行版、它们的设计理念是企业应用,强调安全可靠、所以在系统的配置中;除非root指定否则不会有用户具备sudo特权。
简单来说sudo一般就是设置普通用户能够执行指定的管理员用户的管理命令;并可以设置只能在哪台主机上来操作服务器;另外当被授权的普通用户在执行管理命令时还需要输入普通用户的密码以确保他人恶意冒充执行管理命令;sudo还有一个好处就是在日志中记录那个用户执行了什么命令。
sudo的配置文件/etc/sudoers,此文件的权限只有管理员可以看并且不建议使用vim编辑器来编辑此文件跟cron一样有专门编辑的命令可以检测语法问题以免产生语法错误导致系统崩溃;针对sudo编辑专门提供了一个命令visudo。
二、visudo命令
拥有sudo权限的账户由/etc/sudoers文件维护,我们只需修改该文件的内容即可指定用户拥有sudo权限。但sudoers文件具有一定的语法规则,因此不建议使用vim直接修改,而是使用visudo命令进行操作,因为visudo命令能进行语法检查,当我们出现语法错误时能够及时纠正。
- 指定用户拥有的sudo权限
执行visudo命令默认会进入到/etc/sudoers文件,就可以定义用户权限了,权限配置格式如下:
1 |
root ALL=(ALL) ALL |
这句指令含义组合就是允许root用户可以通过所有主机来本机执行所有命令。
1. 第一个参数表示允许进行sudo操作的用户名。
2. 第二个参数表示允许的源主机IP。
3. 第三个参数表示可以切换的用户名。
4. 第四个参数表示允许执行的命令。
- 限制sudo用户操作指令
授予某个用户只能执行某些命令:
1 |
hadoop ALL=(root) /usr/sbin/useradd,/usr/sbin/usermod |
指令组合含义是定义Hadoop用户可以在所有的主机上指定root用户的useradd,usermod命令。
- 指定用户组拥有的sudo权限
除了执行用户,也可以使用visudo指定拥有sudo权限的用户组,如下:
1 |
%wheel ALL=(root) ALL |
$表示该用户为一个用户组。在visudo中设置了用户组后,只要是该用户组的用户均有sudo权限。如果想让一个用户获得sudo权限,只需加入该用户组即可,无需再修改sudoers文件。
- 开启sudo免密功能
先前的用户在执行sudo命令后都需要输入自己的密码,然而对于一些十分信任的用户可以免去他们在sudo时输入密码:
1 |
%wheel ALL=(root) NOPASSWD: ALL |
只需在最后一个参数前加上NOPASSWD即可!
也可以定义Hadoop用户执行useradd命令时不需要密码,执行usermod时需要密码,如下:
1 |
hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/usermod |
- 限制来源IP
1 |
hadoop 192.168.10.1=(root) NOPASSWD: /usr/bin/passwd |
定义Hadoop用户只能从192.168.10.1主机上执行passwd命令。
- 取反匹配用户操作指令
1 |
hadoop ALL=(root) NOPASSWD: /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root |
定义Hadoop用户只能执行passwd命令,并且passwd后面必须要有字符串和不需要输入密码,但是不能执行更改root用户的密码(取反优先级最高),这里[A-Za-z]*表示开头必须要有一个字符,只有这样才能避免更改root账号。
- 通过别名设置visudo
visudo支持别名的定义,但必须使用大写字母组合。其通过User_Alias为用户们起一个别名,通过Host_Alias可为主机起别名,通过Cmnd_Alias为可执行的操作起一个别名。如下:
1 2 3 4 5 6 |
User_Alias:USERADMIN = USER_NAME,%GROUP_NAME,OTHER_ALIAS Host_Alias:HOSTADMIN = HOST_NAME,IP,NETWORK_ADDRRESS,OTHER-ALIAS(!可取反) runas_alias:RUNUSERADMIN = USER_NAME,%GROUP_NAME,OTHER_RUNAS_ALIAS Cmnd_Alias:CMDADMIN = CMD_PATH,DIRECTORY(目录内的命令都可用) user_alias USERADMIN = tom,Jerry,%stack cmnd_alias ACCCMD = /usr/sbin/useradd,/usr/sbin/userdel,NOPASSWD:/usr/sbin/id |
应用命令别名
1 |
USERADMIN ALL=(root) ACCCMD |
完结。。。
三、sudo命令
当使用visudo对用户授权完了之后,普通用户就可以使用sudo命令来操作这些命令了,但只能执行/etc/sudoers中定义给普通用户的管理命令。
比如普通用户使用sudo执行useradd命令添加一个账户,如下:
1 |
$ sudo /usr/sbin/useradd hive |
sudo命令还支持很多选项,含义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ sudo --help -a type #使用指定的BSD认证类型; -b #在后台运行命令; -E #在执行命令时保留用户环境; -e #编辑文件而非执行命令; -g group #以指定的用户组执行命令; -H #将HOME变量设为目标用户的主目录; -h #显示帮助消息并退出; -i [command] #以目标用户身份运行一个shell,默认可以切换到root,运行目标用户环境变量; -s [command] #以目标用户身份运行一个shell,默认可以切换到root,运行本地用户环境变量; -K #完全移除时间戳文件; -k #无效的时间戳文件; -l[l] command #列出用户能执行的命令; -n #非交互模式,将不提示用户; -P #保留组向量,而非设置为目标的组向量; -p prompt #使用指定的密码提示; -r role #以指定的角色创建SELinux安全环境; -S #从标准输入读取密码; -t type #以指定的角色创建SELinux安全环境; -U user #在列表时,列出指定用户的权限; -u user #以指定用户身份运行命令(或编辑文件); -V #显示版本信息并退出; |
很多选项看简单的含义可能不是太理解,最好都动手试试就能别名差别了。比如-b表示在后台运行命令,意思就算关闭当前shell窗口,命令仍能够在后台自行执行,而不与目前的shell产生影响。
四、su命令
使用sudo特权时、必须在每个命令前冠以sudo指令才姓,这会给管理员的很多工作照成不必要的麻烦,su命令可以解决这个问题。
su命令就是做临时用户切换的,默认是切换到root用户。su在做用户切换的时候也会提示输入密码,但是与sudo需要输入自己的密码不同,su要求输入目标用户密码,如果是切换到root用户那么就需要root密码,一旦切换完成就会将当前的用户转换成目标用户。如果希望再切换回原始用户,可以使用exit命令即可。
使用su命令时后面可以指定想要切换的用户名(不指定默认是root),如su USERNAME或su – USERNAME,两者的区别是:不加”-”的话就不会改变当前用户的执行环境;而加”-”会切换用户和初始化目标用户的各种环境变量。
su和sudo各有千秋,su能切换用户身份,但需要知道对方的密码,这并不安全;而sudo无需知道对方的密码,但每次执行root命令都需要加上sudo,这很不方面,下面的配置能够让这两种方式的优点结合起来:
1 |
hadoop ALL=(root) NOPASSWD: ALL |
此时只要输入sudo su –后即可切换到root账户。
1 2 3 |
[hadoop@localhost ~]$ sudo su - Last login: Wed Nov 8 03:45:40 EST 2017 from 10.10.80.203 on pts/2 [root@localhost ~]# |
如果不是免密码的,只需要输入Hadoop用户的密码后也可切换到root用户。
另外,sudo命令的这两个指令也是可以切换到目标用户,跟su USERNAME或su – USERNAME作用一样。
1 2 |
-i [command] #以目标用户身份运行一个shell,默认可以切换到root,运行目标用户环境变量; -s [command] #以目标用户身份运行一个shell,默认可以切换到root,运行本地用户环境变量; |
可以自己测试看看。
五、who am i命令
虽然通过sudo su –可以切换到目标用户,但是跟你直接等目标账户登录还是不同的,如下测试:
使用root用户登录、分别使用whoami、who am i、who三个命令显示当前用户登陆情况;当使用su切换到hadoop用户后在使用这三个命令就显示了不同的用户;从上图可以看出切换用户之后就算可以骗的过whoami但是骗不了who am i和who;要解释这背后的运行机制。需要引入另外两个新的概念—-实际用户(UID)和有效用户(EUID)
所谓的实际用户是指用户登陆时所使用的用户,所以在整个登陆会话中实际用户是不会发生变化的;而有效用户则是指当前执行操作的用户,这个是能够利用su或sudo命令进行任意切换的;也就是真正决定权限高低的用户、一般情况下,实际用户和有效用户是相同的只有发生用户身份切换的时候才会出现差异。