安全与加密之su与sudo使用详解

本章目录

  1. su命令的使用

  2. sudo命令

  3. sudo配置说明

  4. sudo别名和示例

前言

在工作生产环境中尽量不要去使用root用户,因为root权限过大,一旦操作失误后将面临十分严重的后果。但许多的系统管理命令和服务为了安全只有超级用户才有权限使用,因此这也无疑让普通用户受到更多的权限束缚,而su命令则是用于便捷的变更使用者的身份,能够让使用者在不注销的情况下顺畅的切换至其他用户。

1.su命令的使用

su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户账号和密码。

语法

su (选项)(参数)

选项
  • -c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;

  • -f 或--fast:适用于csh与tsch,使用shell不用去读取启动文件;

  • -l或--login:改变身份时,也同时变更工作目录。以及HOME,SHELL,USER,LOGNAME,PATH变量等;

  • -m,-p或--preserve-environment:变更身份时,不要变更环境变量;

  • -s或--shell=:指定要执行的shell;

  • --help:显示帮助;

  • --version;显示版本信息

参数

用户:指定要切换身份的目标用户。

示例

变更账号为root查看root家目录后退回当前用户

[zh@zheng ~]$ su -l root -c ls
密码:
anaconda-ks.cfg   gpgtest  initial-setup-ks.cfg 
[zh@zheng ~]$
小结
  1. 若要完整的切换到新使用者的环境,必须使用su - username 或 su -l username,才会彻底转换为新用户;

  2. 如果仅想运行一次root的命令,可以使用su -c 'command'的方式来实现;

  3. 使用root切换为任何使用者时,不需要输入新用户的口令。

  4. 当多人管理时,若大家都是用su来切换为root时,就面临着所有用户都需要知道root口令,这将很不安全,这时就需要用到sudo命令

2.sudo命令

sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

语法

sudo (选项)(参数)

选项
  • -b:在后台执行指令;

  • -h:显示帮助; -H:将HOME环境变量设为新身份的HOME环境变量;

  • -k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。 -l:列出目前用户可执行与无法执行的指令;

  • -p:改变询问密码的提示符号; -s:执行指定的shell; -u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;

  • -v:延长密码有效期限5分钟;

  • -V :显示版本信息。

参数
  • 指令:需要运行的指令和对应的参数。

sudo命令特性:
  1. sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用sudo,会提示联系管理员

  2. sudo可以提供日志,记录每个用户使用sudo操作

  3. sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机

  4. sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”

  5. 通过visudo命令编辑配置文件,具有语法检查功能

示例

以zh用户的身份,在tmp目录下创建一个名为mytest的文件

[root@zheng ~]# sudo -u zh touch /tmp/mytest
[root@zheng ~]# ll /tmp/mytest
-rw-r--r--. 1 zh zh 0 12月  5 22:34 /tmp/mytest
思考

sudo为什么默认仅有root能使用

  1. 当用户运行sudo时,系统与/etc/sudoers文件中搜寻该使用者是否有运行sudo的权限

  2. 若使用者具有可运行sudo的权限后,便让使用者输入用户自己的口令来确认

  3. 若口令输入成功,便开始进行sudo后续命令(root运行sudo时不需要输入口令)

  4. 若切换的身份与运行者身份相同,也不需要输入口令

注意:

sudo运行的重点在于,/etc/sudoers文件中是否有执行者的相关配置,所以能否使用sudo与/etc/sudoers有关,编辑sudoers文件,不能直接使用vim去修改,这个文件内容有一定的语法格式,应使用visudo命令;visudo会调用vi编辑器来修改配置文件,,若存在语法错误,则会报错。

只有超级用户才可以使用visudo命令编辑sudo配置文件(/etc/sudoers);visudo命令优势:1、可以防止多个用户同时修改sudo配置文件;2、对sudo程序配置文件的语法检查;

visudo 语法格式

使用者账号 登录者的来源主机名=(可切换的身份) 可下达的命令 root ALL=(ALL) ALL
这四个组件的意义

  • 使用者账号:系统的哪个账号可以使用sudo这个命令,默认为root

  • 登录者的来源主机名:登录账号由哪部主机链接到本主机,这个配置值可以指定客户端主机,默认值root可来自任何一部网络主机

  • 可切换的身份:这个账号可以切换成什么身份来下达后面的命令,默认root可以切换成任何人

  • 可下达的命令:可用该身份下达什么命令,这个命令请务必使用绝对路径,默认root可以切换任何身份执行任何命令

示例

1.允许用户切换任何身份,执行所有命令

[root@centos7 ~]# visudo 
zh      ALL=(ALL)       ALL
[root@centos7 ~]# su - zh
[zh@centos7 ~]$ sudo -l         #查看zh用户可以使用sudo执行哪些命令
[sudo] password for zh:         #输入zh用户明码
Matching Defaults entries for zh on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME
    HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG
    LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User zh may run the following commands on this host:
    (ALL) ALL               # 可以使用所有命令

[zh@centos7 ~]$ ls /root        #直接查看root目录,被阻止
ls: cannot open directory /root: Permission denied
[zh@centos7 ~]$ sudo ls /root       #使用sudo可以查看
a.sh		dir1	     key.pem		      pubkey.pem	 usr

2.指定某用户只具有管理用户功能

[root@centos7 ~]# visudo
zh  ALL=(root)  /usr/bin/passwd
[root@centos7 ~]# su - zh
[zh@centos7 ~]$ sudo passwd lisi
[sudo] password for zh: 
Changing password for user lisi.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[zh@centos7 ~]$ su - lisi
Password: 
[lisi@centos7 ~]$ whoami
lisi

# 此时就面临一个问题,这个用户是不是就可以更改root用户的密码呢?

[zh@centos7 ~]$ sudo passwd 
Changing password for user root.  # 修改的为root的密码
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.


[zh@centos7 ~]$ sudo passwd root
Changing password for user root. # 指定修改root密码也可以
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[zh@centos7 ~]$ su - root
Password: 
Last login: Thu Dec 29 10:24:12 CST 2016 from 192.168.1.104 on pts/1
[root@centos7 ~]# whoami
root

#此时该如何解决呢?
[root@centos7 ~]# visudo
99 zh  ALL=(root)  !/usr/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
# 加上!,代表不可运行的意思。因此定义为:可以运行passwd+除root以为的任意字符。
[root@centos7 ~]# su - zh
[zh@centos7 ~]$ sudo passwd
Sorry, user zh is not allowed to execute '/bin/passwd' as root on centos7.
[zh@centos7 ~]$ sudo passwd root
Sorry, user zh is not allowed to execute '/bin/passwd root' as root on centos7.
[zh@centos7 ~]$ sudo passwd lisi
Changing password for user lisi.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

3.使用群组免口令功能

# 新建一个user1组,将zh用户加入user1
[root@centos7 ~]# useradd user1
[root@centos7 ~]# usermod -G user1 zh
[root@centos7 ~]# id zh
uid=1008(zh) gid=1020(zh) groups=1020(zh),1021(user1)
# 编辑sudo配置文件
[root@centos7 ~]# visudo
%user1 ALL=(ALL) NOPASSWD: ALL
# 测试
[zh@centos7 ~]$ sudo ls /root
a.sh		dir1	     key.pem		      pubkey.pem	 usr
[zh@centos7 ~]$ sudo -k 
[zh@centos7 ~]$ sudo ls /root
a.sh		dir1	     key.pem		      pubkey.pem	 usr
[zh@centos7 ~]$ exit
logout
[root@centos7 ~]# su - user1
[user1@centos7 ~]$ sudo ls /root
a.sh		dir1	     key.pem		      pubkey.pem	 usr

4.通过别名设置sudo

别名具有以下四种类型

  1. Host_Alias:定义主机别名

  2. User_Alias:定义用户别名,别名成员可以为用户,也可以为用户组(前面加%)

  3. Runas_Alias:定义runas别名,这个别名为“目的用户”,即sudo允许切换至的用户;

  4. Cmnd_Alias:定义命令别名

[root@centos7 ~]# visudo 
User_Alias  USERADMIN = zh,user1
Cmnd_Alias  ADMINCMD = !/usr/bin/passwd,/usr/bin/passwd[a-zA-Z]*,!/usr/bin/passwd root    
USERADMIN   ALL=(root)  ADMINCMD
#测试
[root@centos7 ~]# su - zh
Last login: Tue Jan  3 11:37:05 CST 2017 on pts/0
[zh@centos7 ~]$ sudo ls /root
Sorry, user zh is not allowed to execute '/bin/ls /root' as root on centos7.
[zh@centos7 ~]$ sudo passwd
Sorry, user zh is not allowed to execute '/bin/passwd' as root on centos7.
[zh@centos7 ~]$ sudo passwd root
Sorry, user zh is not allowed to execute '/bin/passwd root' as root on centos7.
[zh@centos7 ~]$ sudo passwd lisi
Changing password for user lisi.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

[root@centos7 ~]# su - user1
Last login: Tue Jan  3 11:41:34 CST 2017 on pts/0
[user1@centos7 ~]$ sudo ls /root/
Sorry, user user1 is not allowed to execute '/bin/ls /root/' as root on centos7.
[user1@centos7 ~]$ sudo passwd 
Sorry, user user1 is not allowed to execute '/bin/passwd' as root on centos7.
[user1@centos7 ~]$ sudo passwd root
Sorry, user user1 is not allowed to execute '/bin/passwd root' as root on centos7.
[user1@centos7 ~]$ sudo passwd lisi
Changing password for user lisi.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

sudo搭配su的使用方法 :

很多时候我们需要大量运行很多root的工作,所以一直使用sudo确实比较麻烦。那么我们可以使用sudo搭配su使用,将身份转为root,而且还用用户自己的口令变成root。这样一来,可以更加方便的管理系统,而且root密码也不会泄露。

示例

[root@centos7 ~]# visudo 
User_Alias  USERADMIN = zh,user1
USERADMIN   ALL=(root)  /bin/su -
[root@centos7 ~]# su - zh
[zh@centos7 ~]$ sudo su - 
[sudo] password for zh: 
Last login: Tue Jan  3 10:11:55 CST 2017 from 192.168.1.104 on pts/0
[root@centos7 ~]# ls
a.sh            dir1         key.pem                  pubkey.pem         usr
[root@centos7 ~]# exit
logout
[zh@centos7 ~]$ exit
logout
[root@centos7 ~]#