Linux课程笔记 用户身份切换命令

 超级用户root具有超级管理权限,由于权限太大,如果管理不好,就会对系统安全带来安全隐患。在工作场景中,一般临时性处理工作,都是以普通用户的身份完成,只在必要时才使用超级用户root。

1  su命令

1.1  su介绍 

通过su命令可以在用户之间切换,超级用户root向普通用户或虚拟用户切换不需要密码(这就是超极权限所在)。其他普通用户之间或者普通用户切换到root,都需要切换用户的秘密验证。

   

su参数选项

注释说明

-,-l,--login

使一个shell成为登陆的shell,如执行su - oldboy,表示该用户改变身份为oldboy,并且使用oldboy用户的环境变量配置。

-c,--command=COMMAND

切换到一个shell下,执行一个命令,然后退出所切换的用户环境

-m,--presserve-environment

切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,较少使用

-s,--shell=SHELL

如果/ec/shell允许,则运行指定的shell

  su实例:

[qinbf@qinbf ~]$ whoami

qinbf

[qinbf@qinbf ~]$ su -  #输入的是root的密码

口令:

[root@qinbf ~]# whoami

root

[root@qinbf ~]# env

HOSTNAME=qinbf

SHELL=/bin/bash

TERM=linux

HISTSIZE=1000

USER=root

……

PWD=/root

LANG=zh_CN.UTF-8

SHLVL=1

HOME=/root

LOGNAME=root

[root@qinbf ~]# su - qinbf

[qinbf@qinbf ~]$ whoami

qinbf

[qinbf@qinbf ~]$ env

HOSTNAME=qinbf

SHELL=/bin/bash

TERM=linux

HISTSIZE=1000

USER=qinbf

…….

PWD=/home/qinbf

LANG=zh_CN.UTF-8

SHLVL=1

HOME=/home/qinbf

LOGNAME=qinbf

[qinbf@qinbf ~]$ exit   # exit退出当前用户,这个命令可以用ctrl+d替换

logout

[root@qinbf ~]#

总结:su切换到其他用户不加“-”,环境变量是不会改变的,可能会导致异常,比较规范的写法是“su  -  用户”

如何让系统在每一次开机时自动普通用户启动指定的服务脚本?

把要执行的脚本放入开机自启动配置文件/etc/rc.local

su  -  tddoc  -c  ‘/bin/sh /home/tddoc/bin/deploy.sh’

su命令优缺点

            su命令为我们管理linux带来方便,但是也带来了很大的安全管理问题,切换到root身份,可以改掉root的密码,让其他用户无法再切换到root。使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择。建议使用sudo代替su。

      su致命的缺点:

1)   普通用户必须知道root密码才可以切换到root,这样root密码就泄露开了。

2)   使用su命令切换身份,无法对切换后的身份做精细的控制,可以为所欲为,甚至改掉root密码。

2 sudo命令

通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细)授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权。

2.1  sudo执行的流程

1)                 当用户执行sudo时,系统会首先查找/var/run/sudo/%HOME(如果是新用户会先生成此目录)目录中是否有用户时间戳文件,如果时间戳文件过期,则提示用户是否输入自身的密码(不是root或者要切换的用户密码)

2)                 当密码验证成功后,系统会查找/etc/sudoers配置文件,判断用户是否有执行相应sudo命令权限

3)                 如果具备执行相应sudo权限,就会自动由当前用户切换到root,然后以root身份执行该命令

4)                 执行完成后,又会自动直接退回到当前用户shell下。

2.2  sudo语法

      sudo  [参数选项] 命令

sudo参数选项

注释说明

-l

列出用户在主机上可用的和被禁止的命令

-v

验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接运行sudo,可用-v可以跟踪最新的时间戳

-u

指定以某个用户身份执行特定的操作

-k

同-K,删除时间戳,下一个sudo命令提供密码。前提是该用户授权中不能有NOPASSWD参数

                            sudo授权的方法

1)   执行visudo命令

2)   直接修改/etc/sudoers文件

直接修改sudoers配置文件方法有以下需要注意的几点:

  1. echo命令是追加>>,不是重定向>,除了echo外,可以用cat、sed等命令实现此功能;
  2. 修改操作完成一定要执行visudo  -c进行语法检查,这弥补了直接修改的不足
  3. 确保/etc/sudoers权限是正确的(-r--r-----),权限不对会导致sudo功能异常
  4. 及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口)
  5. 确保知道正确root用户密码,以便在出现问题时可以通过普通用户等候执行su-命令切换到root进行恢复。

3)   使用用户组的方式实现sudo授权

通过授权一个用户组的方式来配置/etc/sudoers,这样以后有增加用户需要相同的授权时,直接将用户加入到sa组就可以享受sa组的sudo授权了。

%sa                     ALL=(All)            ALL

#注意用户组授权和普通用户的区别,开头为“%”百分号。sa组同用户一样必须是已经存在的。

2.3  sudo实例:

[root@qinbf ~]# useradd sun

[root@qinbf ~]# echo "qbf" |passwd --stdin sun

Changing password for user sun.

passwd: all authentication tokens updated successfully.

[root@qinbf ~]# su - sun

[sun@qinbf ~]$ touch /root/sun.txt

touch: 无法触碰 “/root/sun.txt”: 权限不够

[sun@qinbf ~]$ sudo /root/sun.txt

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 sun:

Sorry, try again.

[sudo] password for sun:

sun is not in the sudoers file.  This incident will be reported.

方法一:

[root@qinbf ~]# visudo

81 ## Allow root to run any commands anywhere

     82

     83 root    ALL=(ALL)       ALL

     84 qinbf   ALL=(ALL)       ALL

     85 sun     ALL=(ALL)       ALL #允许sun用户在任何主机、对任何用户、执行任何操作

方法二:

[root@qinbf ~]# echo "sun   ALL=(ALL)   ALL">>/etc/sudoers

[root@qinbf ~]# visudo -c    #检查/etc/sudoers文件的语法

/etc/sudoers: parsed OK

[root@qinbf ~]# ll /etc/sudoers  #检查/etc/sudoers文件的权限

-r--r----- 1 root root 3438 06-05 15:05 /etc/sudoers

方法三:

[root@qinbf ~]# grep sa /etc/group

sa:x:801:oldboy6

[root@qinbf ~]# echo "%sa   ALL=(ALL)   ALL">>/etc/sudoers

[root@qinbf ~]# usermod -G sa sun

验证:

[sun@qinbf ~]$ sudo touch /root/sun.doc

[sun@qinbf ~]$ sudo ls -l /root/sun.doc

-rw-r--r-- 1 root root 0 06-05 15:10 /root/sun.doc

 3  /etc/sudoers配置文件

 3.1    /etc/sudoers的规则大致可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。

                

1)   Host_Alias定义主机别名

# Host_Alias     FILESERVERS = fs1, fs2

# Host_Alias     MAILSERVERS = smtp, smtp2

                  

2)   User_Alias定义用户别名

User_Alias  ADMINS = jsmith, mikem

3)   Runas_Alias定义runas别名

这个别名指定的是“用户身份”,即sudo允许切换至的用户

Runas_Alias SUPER = root

4)   Cmnd_Alias定义命令别名

## Services

#Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

## Updating the locate database

#Cmnd_Alias LOCATE = /usr/bin/updatedb

3.2 别名实例

                            实例1:定义用户别名

User_Alias  ADMINS = oldboy,  ett,  %oldboy

#-->定义用户别名ADMINS,包含oldboy,ett及oldboy组的成员

                           

                            实例2:定义命令别名

Cmnd_Alias  NETWORK = /sbin/ifconfig, /etc/init.d/network

#

1)  所有的命令别名下的成员必须是文件或目录的绝对路径

2) 命令别名超过一行时,可以通过“”号换行

3) 在定义时,可以使用正则表达式,如/usr/bin/passwd [A-Za-z]*。

                            实例3:定义Runas别名

Runas_Alias  OP = root, oldboy

特别说明:runas别名的定义也不多见

 3.3  /etc/sudoers配置文件中的授权规则

                           

oldboy      ALL=(ALL)    ALL

#-->授权中的所有ALL字符串必须大写。其中,第一、二个ALL字符串不大写的话,visudo语法检查可以过,但是授权实际配置达不到配置需求,最后一个ALL必须大写,否则visudo语法检查通不过。

这一行代表的意思是:

授权用户    主机=(指定的可切换的用户) 可以执行的命令动作

因此,上面一行授权内容的实际意思就是,oldboy用户可以在所有的主机上,切换到所有用户,执行所有的命令。

如果忽略上面括号的内容,如写成:

oldboy      ALL=         ALL

那么只能切换到root执行所有命令。

如果希望在执行命令时不提示密码,就用这个NOPASSWD:ALL语法来授权

如果不希望执行某个命令,那么就在这个命令前面加上“!”

 3.4  /etc/sudoers配置文件授权规则实例

在/etc/sudoers文件的末尾添加以下两行:

Cmnd_Alias USER_ADMIN = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

test  ALL=(ALL)    USER_ADMIN

"/etc/sudoers" 109L, 3595C 已写入

[root@test2 ~]# visudo -c

/etc/sudoers: parsed OK

[root@test2 ~]# ll /etc/sudoers

-r--r----- 1 root root 3595 06-08 10:07 /etc/sudoers

[test@test2 ~]$ vi .bash_profile

#修改test用户的环境变量,添加以下黄色部分的变量

PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[test@test2 ~]$ source .bash_profile

[test@test2 ~]$ sudo useradd bifeng 

[sudo] password for test:

[test@test2 ~]$ sudo passwd bifeng

Changing password for user bifeng.

New UNIX password:

Retype new UNIX password:

Sorry, passwords do not match.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[test@test2 ~]$ sudo passwd root

[sudo] password for test:

Sorry, user test is not allowed to execute '/usr/bin/passwd root' as root on test2.localdomain.

[test@test2 ~]$ sudo passwd

[sudo] password for test:

Sorry, user test is not allowed to execute '/usr/bin/passwd' as root on test2.localdomain.

再添加一行:

Cmnd_Alias USER_CHANGE = /bin/chown

修改test的权限:

test  ALL=(ALL)    USER_ADMIN, NOPASSWD: USER_CHANGE

[test@test2 ~]$ sudo /bin/chown sun.sun /root/sun.txt

[test@test2 ~]$

#-----à不再需要密码提示

3.5 sudo配置文件/etc/sudoers授权规则注意事项总结:

1)   授权规则中的所有ALL字符串必须为大写字母

2)   Cmnd_Alias USERCMD = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd、/usr/bin/passwd[A-Za-z]*, /bin/chown, !/usr/bin/passwd root

允许执行的命令是有顺序的,从老师的测试结果来看,命令的顺序是从后面向前,即把允许执行的命令放在禁止命令的后面

3)   一行内容超长可以用“”斜线换行

4)   “!”叹号表示非,就是命令取反的意思,即禁止执行的命令。

5)   测试之前要记得修改普通用户的环境变量.bash_profile文件,把root的环境变量加入到普通用户的后面。

3.6 远程执行sudo命令

在默认情况下,我们是无法通过ssh远程执行sudo命令的

在/etc/sudoers有这样的配置:

53 # Disable "ssh hostname sudo <cmd>", because it will show the password in clear.

 54 #         You have to run "ssh -t hostname sudo <cmd>".

 55 #

 56 Defaults    requiretty

根据注释我们可以知道,这个“Default  requiretty”就是禁止我们通过ssh远程执行sudo命令的明确配置,但是禁止执行的远程ssh  sudo  命令格式为“ssh  hostname  sudo  <cmd>”,禁止的原因是因为会明文显示密码,但是我们可以通过“ssh  -t  hostname sudo  <cmd>”的方式

 4 配置sudo命令审计

 4.1 日志文件配置

1)安装sudo,syslog命令服务

yum  install  sudo syslog

[root@test2 ~]# yum install sudo syslog

2)配置系统日志/etc/syslog.conf

           echo  “local2.debug    /var/log/sudo.log” >>/etc/syslog.conf

31news.=crit                             /var/log/news/news.crit

 32news.=err                             /var/log/news/news.err

 33news.notice                           /var/log/news/news.notice

 34local2.debug                          /var/log/sudo.log

3) 配置/etc/sudoers

           增加配置“Defaults      logfile=/var/log/sudo.log”>>/etc/sudoers

4) 重启syslog内核日志记录器

           /etc/init.d/syslog  restart

[root@test2 ~]# /etc/init.d/syslog restart

关闭内核日志记录器:                                       [确定]

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:                                       [确定]

启动内核日志记录器:                                       [确定]

5) 测试sudo日志审计配置结果

[test@test2 ~]$ sudo useradd bill

[test@test2 ~]$ sudo passwd bill

Changing password for user bill.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[test@test2 ~]$ sudo useradd lily

[test@test2 ~]$ passwd lily

passwd: Only root can specify a user name.

[test@test2 ~]$ sudo passwd lily

Changing password for user lily.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[test@test2 ~]$ sudo chown root.root /root/sun.txt

[root@test2 ~]# tail /var/log/sudo.log

 6月  8 11:02:45 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/sbin/useradd bill

 6月  8 11:02:52 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/bin/passwd bill

 6月  8 11:03:32 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=list

 6月  8 11:03:51 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=validate

 6月  8 11:04:12 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/sbin/useradd lily

 6月  8 11:04:22 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

COMMAND=/usr/bin/passwd lily

6月  8 11:07:04 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/bin/chown root.root /root/sun.txt

4.2 日志写到其他主机:
  1. 配置syslog服务器配置文件(/etc/sysconfig/syslog)中添加:

SYSLOGD_OPTIONS=”-m O -r -x”  # -r是指接收远程日志的意思

重启syslog服务器

/etc/init.d/syslog   restart

  1. 客户端配置

编辑/etc/syslog.conf

修改

local2.debug   /var/log/sudo.log

修改为

local2.debug   @中央服务器的IP

 

 

原文地址:https://www.cnblogs.com/fengze/p/6752468.html