• 作者:老汪软件技巧
  • 发表时间:2024-10-08 17:00
  • 浏览量:

简介

在RHEL7当中控制用户权限有DAC和ACL两种方式来控制文件或目录对于相应用户或组的权限,有的时候管理员为了系统安全往往会把root用户给藏起来,不给ssh远程登录,那时我们将使用到sudo来临时获得root用户的权限,或者通过su来切换到拥有权限的用户进行操作,该篇将会讲述用户和权限的相关配置与使用,以及如何临时获得root权限与如何切换用户

用户和权限

下面将分开介绍在RHEL7当中的用户与权限,将把用户部分分成用户和组,权限部分只介绍DAC方面的权限控制和umask

用户和组

在RHEL7当中与用户相关的配置文件主要有几个,分别是/etc/passwd和/etc/shadow,此外还有/etc/group与此相关

1./etc/passwd

#进入该文件可以看到以下示例
> vim /etc/passwd
####################
...
#root用户
root:x:0:0:root:/root:/bin/bash
#系统用户
bin:x:1:1:bin:/bin:/sbin/nologin
#普通用户
testuser:x:500:502::/home/testuser:/bin/bash
...
####################

字段备注

字段1

帐号名

字段2

用户密码,x意为密码在/etc/shadow

字段3

UID,6版本的普通用户UID数从500开始用起,1-499为系统使用帐号,7版本为1000,1-999为系统使用帐号,root用户其UID为0,该设置与/etc/login.defs有关

字段4

GID,6版本的普通用户GID数从500开始用起,1-499为系统使用帐号,7版本为1000,1-999为系统使用帐号,root用户其GID为0,该设置与/etc/login.defs有关

字段5

用户信息说明栏

字段6

家目录,root用户家目录/root,普通用户家目录默认为/home/username

字段7

Shell,可以是/bin/bash,/bin/ksh,/bin/csh,/sbin/nologin等

useradd

#增加一个用户
> useradd -g groupname -d /home/username -s /bin/bash -e 2015-07-01 userame

参数备注

-g

初始用户组,一个用户可以加入多个组,未指定组时,默认组名与用户名相同

-G

附属组,一个用户可以属于多个组

-d

指定家目录,/etc/skel/下的东西都会默认放到每一个新建的用户家目录下,默认创建在/home/username下

-s

指定shell,默认为/bin/bash,也可以是/sbin/nologin,/sbin/nologin在邮件系统帐号创建,FTP用户帐号,无需登录,也无法登录

-e

过期时间

当需要创建系统账号时则需要使用以下命令

#创建系统账号
> useradd -r username
#系统帐号在创建时至少会参考如下文件
#/etc/login.defs /etc/default/useradd /etc/skel
#查看历史命令,可使用grep来进行过滤
> history

/etc/shadow

#进入该文件可以看到以下示例
> vim /etc/shadow
####################
...
#root用户
root:$6$ppPitqe0$obp0N/3vqJveMexB9RaOgTt2pEYKjukH6sFY26dU9PRq/vVj5j2wyqYXFOEDPqnWw3CPtONVpZ8HBFfhgTYAB/:18271:0:99999:7:::
#系统用户
bin:*:17703:0:99999:7:::
#普通用户
jove:$6$CbUcNJQ1T33vU307$RnVYoL98ynaTXFSpSouljK.4Z2uEGfrsi9tjAlSMc.ZDfyOjtr2xfbkM8fAqtseGR6rCdjSha7HMbB9.GaeRC.:18263:0:99999:7:::
...
#查看用户相应的字段
> chage -l username
####################

字段备注

字段1

用户名称

字段2

加密后的密码

字段3

最近更改密码的日期,以1970.1.1开始算起至今,以天为单位

字段4

密码不可更改的天数,为0就是可随时更改

字段5

密码需要重新更改的天数,99999表示密码不需要重新更改,并不受天数限制

字段6

密码更改期限前的警告期限,当密码快到期时,提前这个数字的天数发出警告

字段7

密码过期的宽限时间,当密码已经过期,在这个天数内,还可以使用这个密码登录

字段8

帐号失效日期,以1970.1.1开始算起至今,以天为单位

字段9

保留字段

密码(强度)策略文件

在RHEL7当中,密码(强度)策略文件我们需要关注的是/etc/pam.d/passwd和/etc/pam.d/system-auth

> vim /etc/pam.d/system-auth
####################
...
#密码设置中,大小写敏感,密码最小长度为10个字符,新旧密码至少要有6个不同,大写字母至少2个
password requisite pam_pwquality.so try_first_pass retry=4 type= minlen=10 difok=6 ucredit=2
...
####################

功能字段功能示例

minlen

密码最少长度

minlen=8(密码长度至少为8)

difok

新旧密码之间字符不相同数

difok=4(新旧密码至少要有4个不同)

ucredit

密码至少含有大写字母数

ucredit=2(密码包含的大写字母至少2个)

lcredit

密码至少含有小写字母数

lcredit=1(密码包含的小写字母至少1个)

dcredit

密码至少含有数字数

dcredit=3(密码包含的数字至少3个)

ocredit

密码至少含有特殊字符数

ocredit=1(密码包含的特殊字符至少1个)

当我们设置了密码(强度)策略后,很多时候会因为设置得太过复杂而导致更改密码时会引起不必要烦恼,我们可以借助密码生成程序来生成一些无序的又符合强度得密码来辅助我们,下面介绍得密码生成程序就是expect(mkpasswd)

#安装mkpasswd命令的包
> yum -y install expect.x86_64
#密码总长度一定要大于或等于所有要求字符的最小值,否则会报错
#生成密码,长度12,数字至少3个,小写字母至少3个,大写字母至少3个,特殊字符至少2个
> mkpasswd -l 12 -d 3 -c 3 -C 4 -s 2

参数备注

-l

定义密码的长度。 默认值为9

-d

定义密码中必须包含的最少数字位数。 默认值为2

-c

定义密码中必须包含的最少小写字母字符数。 预设值为2

-C

定义密码中必须包含的最少大写字母字符数。 预设值为2

-s

定义密码中必须包含的最少特殊字符数。 预设值为1

passwd

当创建用户后,下一步应该设置的是用户密码

#修改用户密码
> passwd username
#修改当前用户密码
> passwd
#锁定用户
#可通过屏蔽/etc/shadow对应行,实现锁定功能
#当使用usermod锁定用户时,该用户/etc/shadow第二字段会在最前头加上"!"
#当使用passwd锁定用户时,该用户/etc/shadow第二字段会在最前头加上"!!"
> usermod -L username
> passwd -l username
#解锁用户
> usermod -U username
> passwd -u username

设置密码前,在/etc/shadow显示

####################
...
username:!!:18283:0:99999:7:::
...
####################

设置密码后,在/etc/shadow显示

####################
...
username:$6$D2H6...:18283:0:99999:7:::
...
####################

当编写脚本时需要使用无交互式的密码修改方式,命令如下

> echo "redhat" | passwd --stdin username

userdel

当需要删除用户时,应该使用以下命令

#删除用户,只会删除/etc/passwd和/etc/shadow中的相关信息,/home下的家目录并不会删除
> userdel username
#删除用户,连家目录一起删除,但/var/spool/cron和/var/spool/mail并不会删除,需要手动删除
> userdel -r username

/etc/group

#查看用户组信息,groups排在第一个的是初始组,后面的是附属组
> id username
uid=1002(username) gid=1002(username) groups=1002(username),1001(test)
#添加GID为10000的用户组groupname
> groupadd -g 10000 groupname
#打开用户组的配置文件,可以在最底部看到刚添加的组信息
> vim /etc/group
####################
...
#组内用户都会显示在字段4,创建用户默认添加的组一开始是没有显示的,-G后会显示
test:x:1001:username
username:x:1002:
groupname:x:10000:
...
####################
#替换/etc/passwd字段4,初始用户组
> usermod -g groupname username
#修改/etc/group第4字段,将会以累加的方式进行添加
> usermod -G groupname username
> usermod -G groupname1,groupname2 username
#除了以上用命令修改用户所属组外,还可以直接修改/etc/group文件来进行配置

字段备注

字段1

_用户权限rbac_用户权限表

组名,创建用户时会默认创建与用户名相同的组

字段2

组密码,通常情况下没有需要

字段3

GID,GID会根据/etc/group字段3当中的最大GID进行累加

字段4

组包含的用户,当用户名与组名相同时默认不显示,当使用-G添加时,即使是同名用户也会显示在/etc/group当中

用户切换

用户之间的切换多使用su来进行切换,除此之外还可以使用ssh来进行切换

语法:

#允许用户临时的改变帐号
#默认用户是root,当使用“ - ”选项产生新的登录shell
> su [-] [user]
#不切换终端用户界面就可以在指定用户下使用命令
> su [-] [user] -c command

示例:

#切换到root用户下
> su -
#切换到userame用户下
> su - username
#退出用户
> exit

注-1:su -和su的区别,建议使用 “-”,使用“-”就要考虑,是否读入想切换的身份者的环境参数文件,“-”彻底转换,未加“-”,会保留之前的(PATH和pwd),家目录下的.bash_profile文件

在切换用户时还会涉及到PS1的设定,PS1是命令行头信息的配置,默认的配置是“[\u@\h \W]$ ”,当然我们也能按照我们自己的习惯进行修改,首先要用默认配置和效果进行对比,对比出是哪里对应哪里,如下图所示:

[\u=root @=@ \h=localhost \W=当前所在目录]$=提示字符

当需要对PS1进行更改时可以用以下命令进行修改

#显示当前的PS1配置
> echo $PS1
#修改PS1配置,显示完整的主机名
> PS1="[\u@\H \W]$"

下表为一些常用的字符

字符备注

\d

日期,星期 月 日

\H

显示完整的主机名

\h

显示首段主机名

\t

显示24小时制的时间,HH:MM:SS

\T

显示12小时制的时间,HH:MM:SS

\A

显示24小时制的时间,HH:MM

\u

显示当前用户ID

\v

显示BASH的版本信息

\w

显示完整的工作目录,家目录会以~代替

\W

显示当前所在工作目录,家目录会以~代替

显示已下达了第几个命令

提示符,如果是特权用户或者取得root权限的用户则为#,普通用户则为$

chown和chgrp

chown:改变文件或目录的文件所有者

#改变文件或目录的所有者和组
> chown -R username.groupname directoryname
> chown -R username:groupname directoryname
> chown username.groupname filename
> chown username:groupname filename
#只改变文件或目录的所有者
> chown -R username directoryname
> chown username filename

chgrp:改变文件或目录的所有组

#改变文件或目录的所有组
> chgrp groupname directoryname

用户查询命令备注示例

用于显示目前登入系统的用户信息

w [options] user

who

用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等

who [options] [FILE|ARG1 ARG2]

last

用于显示用户最近登录信息

last [-R] [-num] [ -n num ] [-adFiowx] [ -f file ] [ -t YYYYMMDDHHMMSS ] [name...] [tty...]

lastlog

用于报告所有用户或给定用户的最新登录信息

lastlog [options]

whoami

用于显示当前用户

whoami [options]

wall

用于向每个终端发送消息

wall [-n] [ message ]

权限

在RHEL7当中权限主要分为两种,一是DAC,另外一种为ACL,DAC权限则为ls -l可以看到的权限内容,权限分为三部分,分别为所有者、所有组和其他用户权限,当使用ls -la来查看文件或者目录权限时,所显示的信息解析如下:

第一列(属性)

a :第一个表示文件类型

b:除第一个外后,后面都是以三个为一组

c:最后一位则是ACL的标志位

注:linux下文件是否可执行与文件名后缀无关,与x权限有关

第二列(连接数)

#查看/etc下的连接数总和
> ls -la /etc/ | grep "^d" | wc -l
#在目录下使用ls -l,可以查看该目录下文件的连接数
> cd /;ls -l
> ls -lad /etc

注:对于目录来讲,该列显示的就是其下的目录数(包含.和..)

第三列(文件所有者)第四列(文件的所有组)

注:第三和第四列之间没有关系,owner 不一定在第四列的group内

第五列(文件大小)第六列(文件的创建日期或最近的文件内容修改日期)

修改文件属性和文件属主(组)等属性时,不能改变这个时间,查看文件内容也不能。但是修改这个文件内容时,即便内容无变化,保存退出则会发生变化

第七列(文件名)

上面讲述的是如何查看文件与目录的权限配置,而下面要介绍的是如何修改文件或目录的权限配置

改变文件或目录权限配置使用chmod,除此之外chown与chgrp也可以改变文件或目录的所有者和所有组,由于上面已经讲述过,所以就不重复了

#770的计算方法为
#第一个7代表的是owner=rwx=4+2+1=7
#第二个7代表的是group=rwx=4+2+1=7
#第三个0代表的是others=---=0+0+0=0
> chmod 770 filename

另外一种修改权限配置的方式

命令参数修改位权限位修改目标

chmod

u g o a

+(加入) -(减去) =(等于)

r w x

文件或目录

#owner的权限设置为rwx,group的权限设置为rwx
> chmod u=rwx,g=rwx filename
#在owner,group,others的权限加上x(执行位)
> chmod a+x filename
#在others的权限减去r(可读位)
> chmod o-r filename

权限的配置除了上面所说的还有一个重要的内容,那就是umask,它规定了当一个文件新创建出来时权限为是怎样的。目录的默认权限是777扣除umask,文件的默认权限是目录的默认权限减去执行权限。

#查看当前系统umask
> umask
#umask使用umask命令来设置
> umask 0077

root用户的umask是022,而不具备特权的用户的umask是002,文件的特权将是664,目录的特权将是775。上面提到设置umask是可以通过umask命令来进行设置的,但是这种设置方法只是临时性的设置,当重启机器或者退出用户后就无效了,下面通过配置文件来进行设置,这样的设置就是永久生效的

#单用户永久umask设置
> su - user
> vim ~/.bashrc
####################
...
umask 0022
####################
> . ~/.bashrc
#验证
> umask
#全局永久umask设置
#在这里可以选择这两个文件来进行编辑,分别是/etc/profile和/etc/bashrc
#但是这两个文件有读取顺序的先后,是先读取/etc/profile后读取/etc/bashrc
#在文件当中可以看到有以下的脚本代码,我们直接对脚本代码进行修改就好了
> vim /etc/bashrc
####################
...
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
       #不具备特权的用户
       umask 002
    else
       #具备特权的用户
       umask 022
    fi
...
#也可以在末尾加上,那样无论是什么用户最后umask都会变成022,不推荐
umask 022
####################
> . /etc/bashrc
#测试
> umask
> su - user
> umask

在生产环境中为了保证系统的安全性,通常会把root账户给藏起来,让人无法登录或者使用,但是某些命令需要使用root权限才能进行使用,这个时候就可以使用sudo命令来临时获得root用户的权限来执行原本不能执行的命令了。sudo可以通过visudo和vim /etc/sudoers来查看其当前配置,visudo最终指向的文件其实都是/etc/sudoers,当用户使用sudo时会先去读取/etc/sudoers来查看用户是否有sudo权限,下面我们将来解析/etc/sudoers

sudo command

用户或组 登录的主机 = (可切换的身份) 可执行的命令

字段备注

用户或组或别名

user %group

登录的主机

hostname

可切换的身份

系统上的用户,如果没有指定,默认是进行root的身份切换 。如果是ALL,就是说可以切换成任何Linux本机上的帐号

可执行的命令

NOPASSWD: ALL无需输入当前用户的密码,所有命令都可执行,只有ALL的话,就需输入当前用户的密码后,什么命令都可执行,也可以使用命令集组成的命令别名

> vim /etc/sudoers
####################
...
#系统默认
root    ALL=(ALL)       ALL
#有密码获取最高权限
user    ALL=(ALL)       ALL
#无密码获取最高权限
user    ALL=(ALL)       NOPASSWD:ALL
#组有密码获取最高权限
%group  ALL=(ALL)       ALL
#组无密码获取最高权限
%group  ALL=(ALL)       NOPASSWD:ALL
#用户别名
User_Alias ADMINS = user1,user2
#主机别名
Host_Alias HOST = hostname1,hostname2
#命令别名
Cmnd_Alias CMND = command1,command2
#执行身份别名,如root,oracle
Runas_Alias RUNAS = operator1, operator2, operator3
#使用别名的配置为,别名一定要写在该命令前,不然无法读出别名
ADMINS HOST=(RUNAS) CMND
#无密码获取最高权限,除修改root密码与切换至root用户的命令外
ADMINS ALL=NOPASSWD:ALL,!/usr/bin/passwd root,!/usr/bin/su -
...
####################
#使用修改root密码的命令来进行测试
> su - user
> sudo passwd root