三周第三次课
3.7 su命令
3.8 sudo命令
3.9 限制root远程登录
3.7 su命令
linux系统中,有些事情只有root用户才能做,普通用户是不能做的,这时就需要临时切换到root身份了。
[root@centos7 ~]# useradd test
[root@centos7 ~]# echo "123456789" | passwd --stdin test
Changing password for user test.
passwd: all authentication tokens updated successfully.
[root@centos7 ~]# su - test
[test@centos7 ~]$ whoami
test
[test@centos7 ~]$
使用id命令查看当前用户是谁。
[aming@localhost ~]$ id
uid=1000(aming) gid=1000(aming) groups=1000(aming) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su命令的格式为:
su [-] username,后面可以跟-,也可以不跟-。加-的作用是为了彻底的切换用户,包括它的一些自己的配置、环境变量等等。加-是在自己的家目录下,就会加载自己家目录下的配置文件。总之,切换用户要加-,这样才切换的彻底。
普通用户的su命令不加username时,就是切换到root用户。当然,root用户同样可以使用su命令切换到普通用户。该命令加上-后,会初始化当前用户的各种环境变量。
[test@centos7 ~]$ pwd
/home/test
[test@centos7 ~]$ su
Password:
[root@centos7 test]# pwd
/home/test
[root@centos7 test]# exit
exit
[test@centos7 ~]$ su -
Password:
Last login: Wed Dec 27 03:49:01 CST 2017 on pts/0
[root@centos7 ~]# pwd
/root
如果不加-切换到root账户时,当前目录没有变化;而加上-切换到root账户时,当前目录为root账户的家目录。这跟直接登录root账户是一样的。当由root切换到普通用户时,是不需要输入密码的。
在root账户下,不进入某一个账户但以这个账户来执行一条命令,示例如下:
[root@localhost ~]# su - -c "touch /tmp/aming.111" aming
[root@localhost ~]#
命令执行是否成功,使用如下命令查看:
[root@localhost test]# ls -lt /tmp | head
total 4
-rw-r--r--. 1 aming grp2 0 Jan 8 05:32 aming.111
drwx------. 3 root root 17 Jan 7 22:11 systemd-private-e1b35a0cde85463589173981b61577ef-chronyd.service-jU7wZn
drwx------. 3 root root 17 Jan 7 22:11 systemd-private-e1b35a0cde85463589173981b61577ef-vmtoolsd.service-T4KQ20
drwx------. 3 root root 17 Jan 7 22:11 systemd-private-e1b35a0cde85463589173981b61577ef-vgauthd.service-5MjukE
drwx------. 3 root root 17 Jan 6 03:16 systemd-private-e68ca9c130244734a4df85c49e044a9a-chronyd.service-YMLQEY
drwx------. 3 root root 17 Jan 6 03:16 systemd-private-e68ca9c130244734a4df85c49e044a9a-vmtoolsd.service-SVKV3C
drwx------. 3 root root 17 Jan 6 03:16 systemd-private-e68ca9c130244734a4df85c49e044a9a-vgauthd.service-BDGAFh
drwx------. 3 root root 17 Jan 5 04:06 systemd-private-c43011ea430e467886a572b54c41de2e-vmtoolsd.service-7eHHCf
drwx------. 3 root root 17 Jan 5 04:06 systemd-private-c43011ea430e467886a572b54c41de2e-vgauthd.service-v2Nfxn
[root@localhost test]# id aming
uid=1000(aming) gid=1001(grp2) groups=1001(grp2),1002(user5)
[root@localhost test]#
3.8 sudo命令
用su可以切换用户身份,而且每个普通用户都能切换到root身份。为了不使root密码泄露,所以设计了sudo命令。
使用sudo命令执行一个只有root才能执行的命令是可以办到的,但是需要输入密码(用户自己的密码)。默认情况下,只有root用户才能使用sudo命令,普通用户想要使用sudo,是需要root预先设定的。我们可以使用visudo命令编辑相关的配置文件/etc/sudoers。如果没有visudo命令,可以使用命令
yum install -y sudo安装。
默认root支持sudo,是因为这个文件有一行root ALL=(ALL) ALL。在该行下面加入test ALL=(ALL) ALL,就可以让test用户拥有sudo的特权。从做到右,第一段test这里为一个用户,指定让哪一个用户有sudo特权;第二段ALL=(ALL)不好理解,左边的ALL指的是所有的主机,右边的ALL指的是获得哪个用户的身份,第二段几乎都不用配置;第三段设定可以使用sudo的命令有哪些。ALL指的是所有的命令,也可以是ls,mv,cp,但是要写绝对路径。
使用visudo命令编辑/etc/sudoers配置文件(必须要使用root用户),它的使用方法同vi命令一样,即输入i进入编辑模式,编辑完成后,按ESC键,再输入:wq完成保存。
具体操作方法如下:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
test ALL=(ALL) ALL
visudo可以提示哪一行出现错误,如何出现行数呢?可以使用:set nu命令,就可以查看行数。
此时可以验证一下test账户的权限了,方法如下(在root账号下进行):
[root@centos7 ~]# su test
[test@centos7 root]$ ls
ls: cannot open directory .: Permission denied
[test@centos7 root]$ sudo ls
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for test:
1_hard.txt.bak.bak 2.txt.bak.bak anaconda-ks.cfg.bak
[test@centos7 root]$
由于切换到test账户后当前目录还是root,test账户没有任何权限,所以使用命令ls查看时,提示权限不够。然而使用命令sudo ls(这里可以加绝对路径,也可以不加)输入test账户的密码后,就有权限了。初次使用sudo命令时,会提示上面的一大段,当再次使用sudo命令时则不再提示。如果不想输入密码的话,可以在配置文件里要加的哪一行
test ALL=(ALL) ALL变成test ALL=(ALL) NOPASSWD: ALL。
[aming@localhost ~]$ su - user1
Password:
Last login: Tue Dec 26 18:51:19 EST 2017 on pts/0
[user1@localhost ~]$
[user1@localhost ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
[user1@localhost ~]$ sudo /bin/ls /root/
1.c 3.c anaconda-ks.cfg
[user1@localhost ~]$
如果每增加一个用户就设置一样,就太麻烦了。可以进行如下设置:把
##wheel ALL=(ALL) ALL前面的#去掉,让这一行生效。它的意思是,wheel这个组的所有用户都拥有了sudo权限。接下来,只要把需要设置sudo权限的所有用户加入到wheel这个组中即可。如下所示:
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
配置文件/etc/sudoers包含了许多配置项,可以使用命令man sudoers来获得帮助信息。
下面介绍一个示例:
我们的需求是把linux服务器设置成这个样子:只允许使用普通账户登录,而普通账户登录后,可以不输入密码就能用sudo切换到root账户。配置方法如下:
然后在文件的最后加入如下3行:
User_Alias USER_SU = test, aming, user1
Cmnd_Alias SU = /usr/bin/su
USER_SU All=(ALL) NOPASSWD: SU
第一行设定了一个user别名,其实这个USER_SU相当于是test、test1、和aming三个账户;第二行设定了一个命令别名,SU相当于/usr/bin/su;第三行刚介绍过。保存配置文件后,使用test、user1、和aming这三个账户登录linux,不需要密码登录。执行命令sudo su -切换到root账户,获取root账户的所有权利,如下所示:
[root@centos7 ~]# su - test
Last login: Wed Dec 27 05:44:04 CST 2017 on pts/0
[test@centos7 ~]$ sudo su -
[root@centos7 ~]# whoami
root
不允许root直接登录,可以设置一个复杂度极高的密码。这样也会有一个问题,就是普通用户可以使用su命令切换到root,然后再修改一个简单的密码就能直接登录root了。
3.9 限制root远程登录
有这样一个需求,我们平常登陆服务器,是用root用户登录的,这样是有一定危险性的。比如说,root登陆,给root设定了一个密码,如果用密钥登陆还好,若是用密码登陆(比如你们公司用的就是密码登录,密码设置的简单,就会被猜到;复杂的话,你就会记不住,就会将密码记录在文档里)。如果给别人拿到了密码,他就会远程登陆你的服务器,为了安全起见,我们要限制远程登陆root(本地root登陆无法限制)。
现在我们禁止root登陆,只允许普通用户登录,普通用户要想拿到root的权限,可以使用sudo,也可以使用su命令。可以允许临时切换到root用户,但是root的密码你是不知道的。
我们可以把su命令放到sudo的命令列表里面去。逻辑结构如下:服务器root无法登陆了,只允许普通用户登录,普通用户要想su到root用户就需要root的密码,但是root的密码我们是保密的,现在就需要用到sudo了。
普通用户到root需要密码,root用户到root不需要密码,我们可以做一个User_Alias,把普通用户aming、tianqi、user1加到里面去。
# User_Alias ADMINS = jsmith, mikem
User_Alias AMINGS = aming, tianqi, user1
这是设定了用户的alias,然后我们再去设定一个规则,放到下面这个地方。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
AMINGS ALL=(ALL) NOPASSWD: /usr/bin/su
第二个ALL是用户的身份,代表可以切换到任何用户的身份,这里是root。
后面代表使用su命令可以不用输入密码。
现在切换到aming下,再使用命令sudo su - root切换到root不用输入密码。
[root@localhost ~]# su - aming
Last login: Thu Dec 21 23:51:49 CST 2017 on pts/0
[aming@localhost ~]$ sudo su - root
Last login: Wed Dec 27 07:14:43 CST 2017 from 192.168.231.1 on pts/0
[root@localhost ~]# whoami
root
[root@localhost ~]#
现在我们要限制远程登陆,/etc/ssh/sshd_config为sshd服务的配置文件,默认允许root账户通过ssh远程登录linux。要想不允许root用户远程登录linux,具体操作方法为:修改配置文件
/etc/ssh/sshd_config,在文件中查找#PermitRootLogin yes并修改为
PermitRootLogin no。保存配置文件后,需要重启sshd服务,如下所示:
#PermitRootLogin yes改为
PermitRootLogin no
不允许root远程登录,改完配置文件要重启一下。
#systemctl testart sshd.service
然后重新登录,证明是不能远程登录的。
那如何改回可以远程登录呢?把配置文件PermitRootLogin no改为#PermitRootLogin yes,然后重启服务即可。
这个方法只适用于通过ssh远程登录linux的情况。
友情链接:阿铭Linux