Linux系统用户管理和su、sudo详细讲解

1 Linux用户和组

1)Linux是多任务、多用户的系统

2)每个文件和进程,都需要对应一个用户和用户组

3)Linux系统是通过UID和FID来识别用户和组的用户相当于人名,UID和GID相当于身份证号(系统用的)

Linux管理员:root

4)用户和组的关系:

一对一、多对一、一对多、多对多

Linux系统用户分类

超级用户:UID为0 代表是root,皇帝

普通用户:UID范围500-65535,有超级用户或者具有超级用户权限的用户创建的用户(大臣、布衣)

虚拟用户:UID范围1=499,存在满足文件或者服务启动的需要。一般都不能登录,只是傀儡。每个文件和进程,都需要对应一个用户和用户组。

1.2 和用户关联的四个文件

/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow

以上文件内容是由冒号分隔:/etc/passwd内容需要比较熟悉(放在大脑里),其它的了解(在大脑建立索引)

管理用户重要命令汇总

注意,以下带*****标记的命令是在工作中常用到的

命令注释说明
useradd                *****同adduser命令,执行命令可以在系统中添加用户(更改4个用户文件)
userdel执行此命令可删除用户及相关用户配置文件(更改4个用户文件)
passwd*****执行此命令可为用户设置或修改密码,更改/etc/shadow文件
chage修改用户密码有效期限,管理/etc/shadow文件
usermod*****修改用户信息的命令,可通过usermod来修改登录名、用户的家目录等等
id*****查看用户的UID、GID及所归属的用户组
su*****用户角色切换工具
sudo*********sudo是通过另一个用户来执行命令,su是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo能在命令后面直接接命令执行,比如sudo ls /root,这个不需要root密码就可以执行只有root才能执行的命令或具备的目录权限,这个权限需要通过visudo命令管理或直接编辑配置文件(/etc/sudoers)
visudo*********visudo配置sudo权限的编辑命令也可以不用这个命令,直接用vi来编辑/etc/sudoers实现。但是推荐用visudo来操作(会自动检查语法)
pwcov同步用户从/etc/passwd到/etc/shadow

3 管理用户组命令汇总

命令注释说明
groupadd添加用户组
groupdel删除用户组

4 /etc/skel目录

/etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户的家目录下:默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以.开头的文件);通过修改、添加、删除/etc/skel目录下的文件,我们可以为新创建的用户提供统一的、标准的、初始化用户环境

看一下/etc/skel目录下文件的所有内容:

[root@oldboy ~]# ls -la /etc/skel

total 20

drwxr-xr-x. 2 root root 4096 2017-11-17 00:27 .

drwxr-xr-x. 92 root root 4096 2017-12-19 13:33 ..

-rw-r--r--. 1 root root 18 2017-03-23 08:15 .bash_logout

-rw-r--r--. 1 root root 176 2017-03-23 08:15 **.bash_profile**

-rw-r--r--. 1 root root 124 2017-03-23 08:15 **.bashrc**

**\#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

例子:我们在此目录下创建readme.txt文件,然后再创建一新用户,查看该用户家目录的文件内容,会发现普通用户家目录下有我们创建的文件。

[root@oldboy ~]# cd /etc/skel/

[root@oldboy skel]# touch readme.txt

[root@oldboy skel]# useradd rsq

[root@oldboy skel]# ls -a /home/rsq

. .. .bash_logout .bash_profile .bashrc **readme.txt**
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

# 添加用户就相当于把/etc/skel/* 拷贝到/home/rsq/

[root@oldboy skel]# useradd rsq

[root@oldboy skel]# cp -a /etc/skel/* /home/rsq/
  • 1
  • 2
  • 3
  • 4

4.1 /etc/skel的企业场景作用

1、可以把通知的内容放到skel,让登录的人去看

2、同意初始换新用户的环境变量

3、面试题:出现-bash-4.1$ 问题原因及解决办法(原因是家目录下的环境变量不在了)

5 /etc/login.defs配置文件

/etc/login.defs文件是用来定义创建用户时需要的一些用户的配置信息。如创建用户时,是否需要家目录、UID和GID的范围、用户及密码的有效期限等等。

下面是Centos 6.9(Final)版本的/etc/login.defs文件内容:

[root@oldboy ~]# **grep -v "^#" /etc/login.defs**

MAIL_DIR /var/spool/mail # 邮件地址

PASS_MAX_DAYS 99999 # 密码最大有效期

PASS_MIN_DAYS 0 # 密码最小有效期

PASS_MIN_LEN 5 # 密码最小长度

PASS_WARN_AGE 7 # 密码警告期限

UID_MIN 500 # 最小UID

UID_MAX 60000 # 最大UID,其实可定义到65535

GID_MIN 500 # 最小GID

GID_MAX 60000 # 最大GID

CREATE_HOME yes # 是否创建家目录

UMASK 077 # umask来限定所创建家目录的权限

USERGROUPS_ENAB yes

ENCRYPT_METHOD SHA512
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

6 /etc/default/useradd文件

/etc/default/useradd文件是在使用useradd添加用户时的一个需要调用的一个默认的配置文件,可以使用“useradd -D 参数”,这样的命令格式来修改文件里面的内容。

下面看一下文件内容:

[root@oldboy ~]# cat /etc/default/useradd

# useradd defaults file

GROUP=100 # 依赖于/etc/login.defs的USERGROUP_ENAB参数,如果为no,则此处控制

HOME=/home # 把用户的家目录建在/home

INACTIVE=-1 # 是否启用账号过期停权,-1表示不启用

EXPIRE= # 账号终止日期,不设置表示不启用

SHELL=/bin/bash # 新用户默认所用的shell类型

SKEL=/etc/skel #
配置新用户家目录的默认文件存放路径。前面提到/etc/skel,就是配置在这里生效的,即当我们用useradd添加用户时,用户家目录下的文件,都是从这里配置的目录中复制过去的。

CREATE_MAIL_SPOOL=yes # 创建mail文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

7 用户和组管理命令的详细参数

7.1 useradd

useradd参数选项注释说明(带深色标识的内容是最需要掌握的)
-c comment#->新账号passwd档的说明栏
-d home_dir#->新账号每次登入时所使用的home_dir。预设值为default_home内login名称,并当成登入时目录名称。
-e expire_date#->账号终止日期。日期的指定格式为MM/DD/YY。
-f inactive_days#->账号过期几日后永久停权。当值为0时账号则立刻被停权。而当值为-1时则关闭此功能,预设值为-1.
-g initial_group**#->**group名称或以数字来作为用户登入起始用户组(group)。用户组名须为系统现有存在的名称。用户组数字也须为现有存在的用户组。预设的用户组数字为1.
-G group,[…]#->定义此用户为多个不同groups的成员。每隔用户组使用“,”逗号分隔。用户组名同-g选项的显示。默认只为用户的起始用户组。
-M#->不建立用户家目录,优先于/etc/login.defs文件的设定。一般创建虚拟用户时不建立家目录,部署服务时需要创建虚拟用户。
-s shell#->用户登入后使用的shell名称。默认值为不填写,这样系统会帮你指定预设的登入shell(根据/etc/default/useradd预设的值)
-u uid#->用户的ID值。这个值必须是唯一的,除非用-o选项。数字不可为负值。

例子:建立一个oldboy6用户,注释信息为“HandsomeBoy”,uid为806,同属于root,oldboy,sa组,指定登入shell为/bin/sh,并指定家目录为oldboy6.

(这里需要注意,由于事先没有oldboy6目录,故可以手动创建或用-m参数)

[root\@oldboy ~]# useradd -c "HandsomeBoy" -u 806 -G root,oldboy,sa -s /bin/sh -md oldboy6 oldboy6
  • 1
  • 2

7.2 useradd -D

useradd -D 参数选项注释说明
-b default_home#->定义用户所属目录的前一个目录。用户名称会附加在default_home后面用来建立新用户的目录。使用-d后则此选项无效。
-e default_expire_date#->用户账号停止日期
-f default_inactive#->账号过期日后停权
-g default_group#->新账号起始用户组名或ID。用户组名必须为现有存在的名称。用户组ID也必须为现有存在的用户组
-s default_shell#->用户登入后使用的shell名称。修改后新加入的用户都将使用此shell类型,useradd -s参数优先于此默认配置值。

7.3 groupadd

groupadd命令的使用非常简单,但是在生产环境中使用的不多,因此,会简单应用即可。

与groupadd命令相关的文件有:

  • /etc/group

  • /etc/gshadow

groupadd参数选项注释说明
-g gid#->指定用户组GID值。除非接-o参数(如:groupadd -g 1234 -o oldboy),否则ID值必须是唯一的数字(不能为负数)。如果不指定-g参数,则预设值会从500开始。

7.4 groupdel

此命令用的极少,了解即可,示例:

[root@oldboy ~]# tail -2 /etc/group

g1:x:506:

g2:x:507:

[root@oldboy ~]# groupdel g1

[root@oldboy ~]# groupdel g2

[root@oldboy ~]# tail -2 /etc/group

test2:x:504:

rsq:x:505:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7.5 passwd

设置密码的几条事项:

1)如果要为新用户设置密码,则执行“passwd 新用户名”,这需要以root用户的权限来执行设置。

2)默认密码最少是5位,设置密码时要注意

3)非交互式更改密码:echo “123456” | passwd –stdin 用户名

passwd参数注释说明
–stdin**#->**read new tokens from stdin(root only) 从stdin读入密码
-x,–maximum=DAYS#->两次密码修改的最大天数,后面接数字;仅能root权限操作。
-n,–minimum=DAYS#->两次密码修改的最小天数,后面接数字;仅能root权限操作。
-w,–warning=DAYS#->在距多少天提醒用户修改密码;仅能root权限操作
-i,–inactive=DAYS#->在密码过期后多少天,用户被禁掉,仅能root权限操作。

例2:批量创建10个用户stu01-stu10,并且设置随机8位密码,要求不能用shell循环,只能用命令及管道实现

解答:http://blog.51cto.com/oldboy/1608552

例2:要求oldboy用户7天内不能更改密码,60天以后必须修改密码,过去前10天通知oldboy用户,过期30天后禁止用户登录

解答:[root@oldboy ~]# passwd -n 7 -x 60 -w 10 -i 30 oldboy

7.5.1 passwd特殊权限说明

[root@oldboy ~]# which passwd

/usr/bin/passwd

[root@oldboy ~]# ls -l /usr/bin/passwd

-rw**s**r-xr-x. 1 root root 30768 2015-11-24 00:30 /usr/bin/passwd

[root@oldboy ~]# ls -l /etc/passwd

-rw-r--r-- 1 root root 1520 2017-12-20 14:37 /etc/passwd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我们看到/usr/bin/passwd文件的属主权限里带了s权限,这是setuid权限位,这表示允许普通用户以/usr/bin/passwd属主root的权限来执行普通用户本来无法执行的功能。比如:普通用户是没有权限修改/etc/passwd的。因为/usr/bin/passwd命令文件已经设置了setuid权限位(也就是-rws**r-xr-x中的**s),所以普通用户在执行/usr/bin/passwd命令时能够使用root用户的权限,间接的修改/etc/passwd文件,以达到修改自己口令的目的。

7.5.2 企业场景中用户及密码管理

1)密码要复杂8位以上的字母数字特殊字符

2)大的企业用户和密码同意管理(相当于活动目录,openldap)

3)动态密码:动态口令,第三方提供自己开发也很简单。

7.6 chage

前面有写到在管理用户和用户组时,曾使用过chage命令,chage命令是用来修改用户密码有效期限的。(chage -change user password expiry information)

chage命令用法很多,和passwd等命令功能也是有不少重复的。下面列举一下常用的参数。

chage参数选项注释说明
-d,–lastday#->将最近一次密码设置时间设为“最近日期”
-E,–expiredate#->将账户过期时间设为“过期日期”,日期语法:MM/DD/YY
-h,–help#->显示此命令帮助信息并退出
-I,–inactive#->在密码过期后多少天,用户被禁掉,仅能以root操作。
-l,–list#->显示账户年龄信息
-m,–mindays#->将两次改变密码之间相距的最小天数设为“最小天数”
-M,–maxdays#->将两次改变密码之间相距的最大天数设为“最大天数”
-W,–warndays#->将过期警告天数设为“警告天数”

7.6.1 有关用户密码时效

我们知道passwdchage等均可以设置或更改指定帐户密码的安全信息(有效期等),我们也可以通过/etc/login.defs配置文件或/etc/default/useradd针对所有帐户全局修改。

设置用户密码的时效有利有弊: 
优点是可以防止运维人员离职一段时间后发现用户还可以登陆(也可能不是自己的用户),如果设置了帐户有效期,即使用户未被清理,那么,一段时间内也会因为密码时效而被自动锁定。密码时效还可以强制系统管理人员修改定期密码,提升系统安全性。缺点是有一些本来应该保留的用户也因为过期而无法登陆了,另外,在服务器数量很多的情况,更改密码也是很大的工作量。所以,对于用户密码的时效的功能,我们根据实际的工作需求,综合运用。在大规模的运维环境中,使用LDAP服务(微软活动目录)对linux帐户统一认证,批量管理,也是不错的方法。

7.7 userdel

此命令的功能是删除用户及用户相关的信息,与此命令相关的文件有:

  • /etc/passwd - 用户账号资料文件

  • /etc/shadow - 用户账号资讯文件

  • /etc/group - 用户组资讯文件

  • /etc/gshadow - 用户组密码资讯文件

userdel参数注释说明
-r#->连通用户家目录一并删除,在其它位置上的相关文件也将一一找出并删除

7.7.1 企业场景删除用户的处理方法

一般不能确认用户相关目录有没有重要数据就不能用-r

删除经验:

1)vi /etc/passwd注释掉用户,观察一个月,出现问题就可以还原,相当于提前备份

2)把登录shell改成/sbin/nologin.

3)openldap(类似活动目录)账号统一管理的,ldap库里直接干掉用户。所有服务器全部都没了。

提示:只要修改和删除都要小心谨慎

7.8 usermod

usermod命令功能十分强大,在生产场景中使用频率虽然不是很多,但还是比较重要的。它不仅能更改用户的shell类型,所归属的用户组,还能更改用户密码的有效期、登录名等很多用户的信息,其选项和useradd类似,可参考记忆。与usermod命令有关的文件有:

  • /etc/passwd - 用户账号资料文件

  • /etc/shadow - 用户账号资讯文件

  • /etc/group - 用户组资讯文件

  • /etc/gshadow - 用户组密码资讯文件

usermod参数选项注释说明(带深颜色标识的表示重要,需要掌握)
-c comment#->增加用户账号/etc/passwd中的注释说明栏(第五栏)。这个-c参数功能也可以使用chfn命令来修改,当然也可以手动修改/etc/passwd文件来实现
-d home_dir#->更新用户新的家目录。如果给定-m选项,用户就的家目录会搬到新的家目录去,如就的家目录不存在则建个新的。
-e expire_date#->加上用户账号停止日期。日期格式为MM/DD/YY
-f inactive_days#->账号过期几日后永久停权。当值为0时账号则立刻被停权。而当值为-1时则关闭此功能。预设值为-1
-g initial_group#->更新用户新的起始登入用户组。用户组名须已存在。用户组ID必须参照既有的用户组。用户组ID预设值为1.
-G group,[…]#->定义用户为一对groups的成员,即附加组。每个用户组使用“,”逗号隔开来。用户组名同-g选项的限制。
-l login_name#->变更用户login时的名称为login_name。其余信息不变
-s shell#->指定用户登入的shell。如此栏为空,系统将选用系统预设的shell。这个-s参数功能也可以使用chsh命令来修改。当然也可以手工修改/etc/passwd文件来实现。
-u uid#->指定用户UID值。除非接-o参数(如:usermod -u 505 -o oldboy),否则ID值必须是唯一的数字(不能为负数)
-L#->冻结用户的密码,使之无法登陆,实际上就是间接修改/etc/shadow的密码栏。在密码栏的开头加上“!”号,即表示冻结。这个冻结密码的功能和usermod -e、useradd -e、chage -E或passwd -l等命令都有类似的功效,那就是让用户无法正常登陆。
-U#->取消冻结用户的密码

7.9 用户查询相关命令

id、finger、users、w、who、last、lasting、groups

8 Linux用户身份切换命令

8.1 前言

我们都知道linux系统中,超级用户root具有超级管理权限。由于权限太大,如果管理不好,就会对系统安全带来严重隐患。在工作场景中,我们只在必要时才使用超级用户root的权限。一般的临时性处都是以普通用户的身份完成的,那么,当普通用户需要超级用户的权限时,是怎么进行切换管理理工作的呢?

这就不得不提到两个重要的用户身份切换命令su和sudo。下面我们就讲解这两个命令是如何完成用户切换工作,达到系统管理目的的?

在linux系统中,每个文件、目录和进程,都是归属于某一个用户的,没有其用户的许可,其它的普通用户是无法操作的,root除外。root用户的特权还表现在root可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改。

8.2 su命令介绍

简单的说,su命令就是切换用户身份的命令。比如,我们以普通用户oldboy登录到系统后,当要在系统中执行useradd添加用户时,会发现oldboy

用户没有这个权限,这个权限只能由root权限执行。解决办法一是退出oldboy用户,重新以root用户登录。二是我们直接在oldboy用户下,使用su命令来切换到root下进行添加用户的工作,等工作完成后再退出root用户。毫无疑问,上面两个方法,通过su命令切换是一种比较好的办法。

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

8.2.1 su命令参数

su参数注释说明(带标记的表示很重要)
-,-l,–login#->使一个shell成为登录的shell,如执行su -oldboy时,表示该用户想改变身份为oldboy,并且使用oldboy用户的环境变量,如:/home/oldboy/.bash_profile
-c,–command=COMMAND#->切换到一个shell下,执行一个命令,然后退出所切换的用户环境
-m,–preserve-environment#->切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,一般很少使用
-s,–shell=SHELL#->如果/etc/shells允许,则运行指定的shell

由su和su -的区别谈学习linux运维方法

http://blog.51cto.com/oldboy/1053606

su -c例子(分用户方案启动命令):

[root@oldboy ~]# su - oldboy -c ‘/bin/sh /home/tddoc/bin/deploy.sh’

8.2.2 su命令优缺点

毫无疑问,切换用户身份的su命令为我们管理linux 系统带来了很多方便,通过切换到root下,可以完成各种系统管理工作,只要任何一个普通用户知道了root用户的密码,都能以普通用户的身份切换到root来完成本来无法完成的系统管理的工作。

但是,这样通过su命令切换到root后,也带来了很大安全管理问题;比如系统有8个普通用户,都可以通过切换到root身份进行系统管理,甚至还可以改掉root的密码,让其他的普通用户无法再实现系统管理,还有,这么多用户中,有任何一人对系统操作的重大失误,都可能导致整个系统崩溃或数据损失。这样的非集权式管理,在一定程度上就对系统的安全造成了较大的威协。在工作中几乎有一半的问题来自于内部。

所以使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择,如果是一般的中小公司不超过3个管理员时,为了管理方便,使用su来共同管理是可以接受的。如果我们既希望超级用户root密码掌握在少数或唯一的管理员手中,又希望多个系统管理员能够完成更多更复杂的系统管理的工作。那么,如何解决多个系统管理员都能管理系统的而又不让超级权限泛滥的需求,这就需要用到sudo命令来替代或结合su命令来完成要求了。

8.3 sudo 命令介绍

前文我们已经讲解过,使用su命令切换用户身份虽然简单,但是,也有一些致命的缺点:

1)普通用户必须知道root密码才可以切换到root,这样root密码就泄露了。相当于把“刀把”交给了别人。

2) 使用su命令切换身份,无法对切换后的身份做精细的控制,拿到超级权限的人可以为所欲为。甚至可以改掉root密码,让真正的管理员无法在拥有root权限。

那么,怎么来解决最高管理员不泄露root密码,而又能让普通用户拥有一定的超级权限来管理系统并且能让超级特权可控呢? 这就要引出sudo命令。

通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细),授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权(管理员真正允许的root权限)。因此,毫不夸张的说,sudo命令相对于su命令来说,在系统用户的分权管理方面进步了很多,使得集权式管理在理论上得到了保证,从而使系统的安全性方面加强了很多。

visudo或者vi /etc/sudoers,在91行下面加入,也可以在其它位置加入。

root ALL=(ALL) ALL <==此行为第91行

oldboy ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上述内容不同列对应的说明表如下

用户或组机器=(授权角色)可执行的命令(全路径)
userMACHINE=COMMANDS
oldboyALL=(ALL)/usr/sbin/useradd, /usr/sbin/userdel

提示:

如果oldboy用户被授予上述权限,那么它可在所有机器上以所有的角色运行useradd、userdel命令。

如果是针对用户组,则对应的授权命令如下(要加百分号%):

%用户组 机器=(授权使用哪个角色的权限) /usr/sbin/useradd

通过sudo进行授权管理系统的目的:

即能让运维人员千活,又不能威胁系统安全,其实就是前面讲的用户权限最小化原则,还可以审计用户使用sudo的提权操作命令。

为了管理方便,这里暂时给oldboy授权all 权限,即可以管理整个系统。

详细操作过程为:输入visudo找到91行,并在该行下面放入如下内容。

oldboy ALL=(ALL) NOPASSWD: ALL
  • 1
  • 2

#->这个配置结尾的ALL表示oldboy可拥有完全的系统管理权限,NOPASSWD表示提权执行命令时不提示输入密码

#->这里需要注意,赋予所有权限只是在学习场景中才用,实际场景中千万不要这样做

配置完成后要进行检查,命令入下:

[root@oldboy ~]# grep oldboy /etc/sudoers

oldboy ALL=(ALL) ALL
  • 1
  • 2
  • 3
  • 4

也可以使用快速操作命令增加sudo授权,仅限于批量管理的情况:

cp /etc/sudoers /etc/sudoers.ori

echo "oldboy ALL=(ALL) NOPASSWD: ALL" \>\>/etc/sudoers

tail -1 /etc/sudoers

visudo -c \#-\>直接追加内容没有语法检测,因此要单独执行语法检查命令。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

1.echo命令是追加“>>”,不是重定向“>”,除了echo外,可以用cat,sed等命令实现类似的功能。

2.修改操作完成一定要执行 visudo-c 
进行语法检查,这弥补了直接修改没有语法检查的不足。

3.确保 /etc/sudoers权限是正确的(-r–r—–),权限不对会导致sudo功能异常(Centos6权限不对也可以登录,但是/etc/sudoers权限是440是最安全的)。

4.及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口,以便发现问题及时恢复)。

5.确保知道正确的root用户密码,以便在sudo出现问题时可以通过普通用户等执行su -命令切换到root进行恢复。

6、授权时注意大小写。

有这么多需要注意的问题,如果不注意,很可能会带来灾难性后果(曾经有一个公司的下属曾经就因为不按规范修改sudoer文件,导致所有普通用户无法执行sudo权限,而又恰巧忘记了root密码(平时不需要root密码管理了),因此只能跑机房通过破解root密码登陆来恢复sudoer文件配置,影响业务不说,这个遭罪啊!),因此,没有特殊紧急批量增加sudoers文件内容的需求,建议通过visudo来编辑修改,毕竟系统安全是相当重要的。

1、注意sudo授权不要授权ALL

2、在实际工作场景中授权时要仔细考虑所授权的命令是否具有危险性,会威胁到root用户。如给一普通用户授予sed命令的权限,感觉没什么危险,但是sed有个参数-i可以修改源文件,虽然/etc/sudoers文件的权限是-r–r—–,即普通用户没有任何权限,但是一旦赋予sed权限,那么就可以在/etc/sudoers配置文件中添加下面一行内容,就等于可以使用root的所有权限了。

这里写图片描述

3、sudo授权对于bash的内置命令处理,是个难题,因为内置命令没有实体文件和路径,不过一般都有解决方法例如可以使sudo ls 替代sudo cd,有的人使用sudo bash后在使用内置命令,这是很危险的,不推荐。

4、若授权一用户某些权限之后,若不授权不输入密码,在第一次用sudo输入密码执行完命令之后后会有5分钟时间不用再次输入密码,此时会在这个目录下生成时间戳: 
[root@oldboy sudo]# pwd 
/var/db/sudo

8.3.1 sudo命令参数

sudo参数选项注释说明(带标记的表示很重要)
-l#->列出用户在主机上可用的和被禁止的命令;当配置好sudo授权规则后,可用这个参数来查看授权情况。
-v#->验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接进行sudo操作;用-v可以跟踪最新的时间戳。
-u#->指定以某个用户身份执行特定的命令操作。 oldboy ALL=(ALL) /bin/cp
-k#->删除时间戳,下一个sudo命令要求提供密码。前提是该用户授权中不能有NOPASSWD:参数。时间戳默认为5分钟

8.3.2 sudo授权之主机别名设定

这里写图片描述

8.3.3 sudo授权之用户别名设定

别名成员可以是用户,用户组(用户组前面要加%号)

这里写图片描述

8.3.4 sudo授权之用户身份别名

这里写图片描述

8.3.5 sudo授权之命令别名

这里写图片描述

8.3.6 实例

什么情况下使用上述别名?

工作中一般有多个系统用户,需要分类,分层次管理用户的时候。

定义别名的实践例子:

由于主机别名,在工作中使用的不多,可以man sudoers或less/etc/sudoers查看。

实例1: 定义用户别名

User_Alias ADMINS = oldboy,ett,%sa #一注意定义的规范。

#一定义系统管理用户别名ADMINS,包含成员oldboy,ett 及sa 组的成员。

User_Alias NETADMINS = leo,maya

#一定义用户别名NETADMINS 来管理网络,包含成员leo,maya。

User_Alias USERADMINS = zuma

#一定义用户别名USERA[MINS 来管理用户,包含成员zuma。

特别说明:

为了方便管理,要尽可能使用有意义的名称作为别名。另外,所有包含成员都必须是系统中存在的用户或存在的组。

检查并创建上述用户及用户组

[root@oldboy~]# id oldboy

uid=500 (oldboy) gid=503 (adminuser) groups=503 (adminuser)
  • 1
  • 2
  • 3
  • 4

特别说明:

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

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

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

8.3.7 sudo配置文件授权注意事项总结

1)授权规则中的所有ALL字符串必须为大写字母,若不为大写,则visudo会报语法错误。

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

oldboy ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/visudo,!/sbin/fdisk,\ 
/usr/sbin/useradd,/usr/sbin/userdel,!/usr/bin/passwd,\ 
/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod,\ 
!/usr/bin/passwd root

允许执行的命令是有顺序的。命令的顺序是从后向前,即把禁止执行的命令放在允许命令的后面。如:/usr/sbin/*,/sbin/*,!/usr/sbin/visudo,!/sbin/fdisk,前面的为允许,后面的为禁止,禁止的命令尽量放在后面。

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

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

8.3.8 远程sudo

默认情况下,我们是无法通过ssh远程执行sudo命令的,可是在生产场景中我们却经常有这样的需求,类似如下

这里写图片描述

在/etc/sudoers配置文件把 Defaults requiretty 这一行内容注释掉即可

这里写图片描述

而后我们可以通过”ssh -t hostname sudo CMD”的方式来执行,也就是加了个-t的参数。-t参数可以强制ssh远程执行本来需要屏幕的程序。

8.3.9 sudo命令日志审计

说明:

所谓sudo命令日志审计,并不记录普通用户的普通操作。而是记录,那些执行sudo命令的用户的操作。

项目实战:简历中1的经验说明

服务器日志审计项目提出与实施20XX.0X - 20XX. XX

1.权限权限方案实施后,权限得到了细化控制,接下来进一步实施对所有用户日志记录方案。

2.通过sudo和syslog(rsyslog)配合实现对所有用户进行日志审计并将记录集中管理(发送到中心日志服务器)。

3.实施后让所有运维和开发的所有执行的sudo管理命令都有记录可查,杜绝了内部人员的操作安全隐患。

企业生产环境日志审计解决方案:

1) 通过环境变量命令及rsyslog服务进行全部日志审计(信息太大,不推荐)。

2) sudo配合rsyslog服务,进行日志审计(审计信息较少,效果不错)

3) 在bash解释器程序里嵌入一个监视器,让所有被审计的系统用户使用修改过的增加了监视器的特殊bash程序作为解释程序。

4) 齐治的堡垒机: 商业产品

现在说的是: sudo 日志审计: 
专门对使用sudo命令的系统用户记录其执行的命令相关信息。

5) python开发的开源产品

开源跳板相l( 堡垒杪l)Jumpserver音署详解

http://blog.51cto.com/zt/658

CrazyEye

http://3060674.blog.51cto.com/3050674/1700814

若是没有sudo和rsyslog要先安装,可yum直接安装

# yum install sudo syslog -y

修改/etc/sudoers配置文件 
(增加配置“Defaults logfile=/var/log/sudo.log”)从而使任何用户在使用sudo提权时都能给记录到日志文件

[root@oldboy ~]# echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers

[root@oldboy ~]# tail -1 /etc/sudoers

Defaults logfile=/var/log/sudo.log

[root@oldboy ~]# visudo -c # 检测配置文件语法

/etc/sudoers: parsed OK
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运维人员必须熟悉的运维工具汇总:

http://blog.51cto.com/oldboy/775056


转载至https://blog.csdn.net/mr_rsq/article/details/78875869


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值