linux用户,组管理介绍

linux操作系统对多用户管理是非常繁琐的,所以用组的概念来管理用户就变得简单了,每个用户可以在一个独立的组,每个组也可以有零个用户或者多个用户,Linux系统用户时根据用户ID来识别的,默认ID长度为32位,默认ID编号从0开始(其实就是root),但是为了和老式系统兼容,用户ID限制在60000以下,linux用户总共分为3种:

  • root用户(ID 0)
  • 系统用户(ID 1~999)
  • 普通用户(ID 1000以上)

linux操作系统用户的特点如下:

  • 每个用户拥有一个UserID,操作系统实际读取的是UID,而非用户名
  • 每个用户属于一个主组,属于一个或者多个附属组,一个用户最多有31个附属组
  • 每个组拥有一个组ID
  • 每个进程以一个用户身份运行,该用户可对进程拥有资源控制的权限
  • 每个可登陆用户拥有一个指定的shell环境

linux用户在操作系统中可以进行日常管理和维护,涉及的相关配置文件如下:

  • /etc/passwd:保存用户信息
  • /etc/shadow:保存用户密码(以加密形式保存)
  • /etc/group:保存组信息
  • /etc/login.defs:用户属性,密码过期时间,密码最大长度等限制
  • /etc/default/useradd:显示或更改默认的useradd配置文件

linux系统中的每个文件或者文件夹都有一个所属用户及所属组,使用id命令可以显示当前用户的信息,使用passwd命令可以修改当前用户密码。

[root@localhost ~]# id lizhifeng
uid=1000(lizhifeng) gid=1000(lizhifeng) 组=1000(lizhifeng)

linux用户管理

如果创建新用户,可以使用命令useradd,执行命令 useradd lizf 即可创建lizf用户,同时会创建一个同名的组lizf,默认该用户属于lizf组

执行useradd lizf会根据以下操作步骤进行:

  • 在/etc/passwd文件中添加lizf用户信息
  • 如使用passwd命令创建密码,密码会被保存在/etc/shadow中
  • 为lizf创建一个家目录/home/lizf
  • 将/etc/skel中的.bash开头的文件复制到/home/lizf家目录
  • lizf组信息保存在/etc/group配置文件中

/etc/passwd文件介绍

Linux用户及权限管理_普通用户Linux用户及权限管理_普通用户_02
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lizhifeng:x:1000:1000::/home/lizhifeng:/bin/bash
mysql:x:997:995:MySQL server:/var/lib/mysql:/sbin/nologin
zabbix:x:996:994:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
#/etc/passwd存放用户的信息,用冒号分隔,一共分为七个部分
第一列为用户名
第二例为用户的密码信息,x表示密码存放于/etc/shadow文件中
第三列为用户的UID
第四列为用户的GID
第五列为用户的描述,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。
第六列为用户的家目录
第七列为用户登陆的shell,nologin代表禁止登陆(伪用户)
伪用户解释:用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux系统要求只有那些在系统中登记了的程序才能出现在这个字段中。系统中有一类用户称为伪用户(psuedousers),这些用户在Linux /etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示。
bin              拥有可执行的用户命令文件
sys              拥有系统文件
adm            拥有帐户文件
nobody       NFS使用
/etc/passwd

 

在使用useradd命令时,可以添加如下参数:

-d:新账户的主目录 
-e:新账户的过期日期 MM/DD/YY
-g:新账户属组的名称或ID
-r:创建一个系统账户
-s:新账户的登录shell
-u:新账户的UID
-G:新建账户的附加组
-c, --comment 注释

案例:

此外我们可以用chage命令去查看用户状态

[root@localhost ~]# chage -l lizhifeng
最近一次密码修改时间                                    :7月 12, 2021
密码过期时间                                    :从不
密码失效时间                                    :从不
帐户过期时间                                            :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :99999
在密码过期之前警告的天数        :7

我们可以编辑/etc/login.defs进行修改 ,那么后建立的账户就会遵循这个配置进行创建

[root@localhost ~]# cat /etc/login.defs | egrep -v "^#|^$"
MAIL_DIR        /var/spool/mail
PASS_MAX_DAYS   99999       #密码过期时间,99999代表永不过期
PASS_MIN_DAYS   0                 
PASS_MIN_LEN    5                 #密码最小长度
PASS_WARN_AGE   7               #在密码过期之前警告的天数
UID_MIN                  1000        #普通用户uid从1000开始
UID_MAX                 60000       #普通用户最大uid值
SYS_UID_MIN               201      #系统用户uid开始值
SYS_UID_MAX               999      #系统用户uid最大值
GID_MIN                  1000         #普通用户gid从1000开始
GID_MAX                 60000        #普通用户gid从1000开始
SYS_GID_MIN               201       #系统用户gid从201开始
SYS_GID_MAX               999       #系统用户gid最大值999
CREATE_HOME     yes                   #自动在/home/创建家目录
UMASK           077                       #家目录默认权限是700
USERGROUPS_ENAB yes              #自动创建用户组
ENCRYPT_METHOD SHA512 

 如果用户已经被创建,我们想修改他的用户信息可以用

chage -I 5 USERNAME:密码5天后失效时间
chage -M 30 USERNAME:密码30天后过期
chage -W 3 USERNAME:在密码过期之前3天警告
chage -E 11/15/19 USERNAME:在19年11月15日账户过期
chage -l USERNAME:查看用户过期时间,密码过期时间等

linux组管理

linux组管理有如下特点

  • 每个组有一个组ID
  • 组信息保存在/etc/group中
  • 每个用户至少拥有一个主组,最多可以拥有31个附属组
  • 通过命令groupadd,groupdel,groupmod来对组进行管理

/etc/group文件解释

[root@localhost ~]# head /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
每一个冒号分隔一个内容
第一列表示组名
第二列表示组密码,x表示组密码放在/etc/shadow下
第三列表示组ID
第四列表示组成员 

groupadd用法如下:

groupadd:创建一个group1的组

[root@localhost ~]# groupadd group1

-g :指定创建的组的ID

[root@localhost ~]# groupadd group2 -g 1500   
#创建一个group2的组,并指定组ID为1500

-r:创建一个系统组

[root@localhost ~]# groupadd -r group3
#创建一个系统组group3
[root@localhost ~]# cat /etc/group | grep group
group1:x:1001:
group2:x:1500:
group3:x:991:

groupmod用法如下:

-n :修改组名

[root@localhost ~]# groupmod -n group200 group1
#将group1组名改为group200

-g :修改组ID号

[root@localhost ~]# groupmod -g 4000 group2
#将group2组ID修改为4000
[root@localhost ~]# cat /etc/group | grep group
group2:x:4000:
group3:x:991:
group200:x:1001:

groupdel 删除组

[root@localhost ~]# groupdel group200       
#删除group200
[root@localhost ~]# cat /etc/group | grep group
group2:x:4000:
group3:x:991:

 

linux用户及组案例

useradd主要用于新建用户,而用户创建完毕,可以使用usermod来修改用户及组的属性。

usermod参数:

-c, --comment 注释                GECOS 字段的新值
-e, --expiredate EXPIRE_DATE  设定帐户过期的日期为 EXPIRE_DATE
-g, --gid GROUP                       强制使用 GROUP 为新主组
-G, --groups GROUPS              新的附加组列表 GROUPS
-L, --lock                                锁定用户帐号
-s, --shell SHELL                     该用户帐号的新登录 shell
-u, --uid UID                          用户帐号的新 UID
-U, --unlock                           解锁用户帐号

案例:

userdel

主要是用来删除用户的

userdel lizhifeng:保留用户的家目录
userdel -r lizhifeng:删除用户及用户家目录,如果用户登陆系统则无法删除
userdel -rf lizhifeng:强制删除用户及该目录的家目录,无论是否登录

 用户密码的管理(最常见的运维操作)

/etc/shadow 详解

[root@localhost ~]# cat /etc/shadow           
root:$6$78f36qtpVNN.SM6n$Se8FiSLr3VL.QmPMOhvu9dFow1TRJnwlbzpCZDY9JmpFpG8AHlBmiXTuaCayNbE8tEu6U78QnpHAG406r4T2X0::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::
mail:*:17834:0:99999:7:::
operator:*:17834:0:99999:7:::
games:*:17834:0:99999:7:::
ftp:*:17834:0:99999:7:::
nobody:*:17834:0:99999:7:::
/etc/shadow存放的是密码信息,每⼀列密码信息都被冒号分割开来。
第⼀列表示存放的是哪个⽤户的密码信息(username)
第⼆列存放的就是密码,该密码并不是明⽂的,⽽是使⽤算法⽣成的,算法在/etc/login.defs中有指定。
第三列存放的是上次修改密码的时间
第四列存放的是密码最⼩有效期,如果是0,就可以⽆限次的不考虑间隔的修改密码,如果是1,就表示,修改完密码之后,必须使⽤该密码⼀天才能再次修改
第五列存放的是密码的最⼤有效期,默认是99999,表示密码99999天就会失效。如果该数字是3,就表示,3天后密码会过期,如果你想继续使⽤,必须要在密码到期之前修改。
第六列存放的是密码到期前提前多少天警告的时间信息,如果该数字为7,就表示密码到期之前的7天就会发出警告,告诉你密码即将过期。
第七列表示⽤户密码到期后宽限⽇期,如果该数字是2,就表示密码到期后,你还能使⽤该密码2天,如果2天到了,你还没修改或更新密码,密码就失效了。
第⼋列表示账号失效⽇期,第⼋列的⽇期就是账号的失效⽇期。如果到了第⼋列的时间,账号直接失效。不可登录。
第九列保留

使⽤passwd命令控制⽤户的密码信息

  -k, --keep-tokens       保持身份验证令牌不过期
  -d, --delete            删除已命名帐号的密码(只有根用户才能进行此操作)
  -l, --lock              锁定指名帐户的密码(仅限 root 用户) 等于usermod -l
  -u, --unlock            解锁指名账户的密码(仅限 root 用户),等于usermod -U
  -e, --expire            终止指名帐户的密码(仅限 root 用户)
  -f, --force             强制执行操作
  -x, --maximum=DAYS      密码的最长有效时限(只有根用户才能进行此操作)
  -n, --minimum=DAYS      密码的最短有效时限(只有根用户才能进行此操作)
  -w, --warning=DAYS      在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)
  -i, --inactive=DAYS     当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)
  -S, --status            报告已命名帐号的密码状态(只有根用户才能进行此操作)
  --stdin                 从标准输入读取令牌(只有根用户才能进行此操作)

修改用户密码的几种方式:

passwd  + username

[root@localhost ~]# passwd lizhifeng
更改用户 lizhifeng 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

echo “PASSWD” | passwd --stdin USERNAME

[root@localhost ~]# echo "12345678" | passwd --stdin lizhifeng
更改用户 lizhifeng 的密码 。
passwd:所有的身份验证令牌已经成功更新。

echo testuser:Newpasswd|chpasswd

[root@localhost ~]# echo  root:12345|chpasswd

使用chage命令管理用户密码信息

  -d, --lastday 最近日期        将最近一次密码设置时间设为“最近日期”
  -E, --expiredate 过期日期     将帐户过期时间设为“过期日期”
  -h, --help                    显示此帮助信息并推出
  -I, --inactive INACITVE       过期 INACTIVE 天数后,设定密码为失效状态
  -l, --list                    显示帐户年龄信息
  -m, --mindays 最小天数        将两次改变密码之间相距的最小天数设为“最小天数”
  -M, --maxdays 最大天数        将两次改变密码之间相距的最大天数设为“最大天数”
  -R, --root CHROOT_DIR         chroot 到的目录
  -W, --warndays 警告天数       将过期警告天数设为“警告天数”

权限管理

 linux权限是操作系统用来限制对方访问资源的机制,权限一般分为读,写,执行,系统中每一个文件都拥有特定的权限,所属用户和所属组,通过这样的机制来限制哪些用户或组可以对特定文件进行相应的操作

linux每个进程都是以某个用户身份运行,进程的权限与该用户的权限一样,用户的权限越大,则进程拥有的权限越大

权限 对文件的影响 对目录的影响
r(读)4 可读取文件内容 可列出目录内容
w(写)2 可修改文件内容 不能查看目录内容,不在目录中创建文件,不能cd到目录中
x(执行)1 可作为命令执行 可以进入到目录,但是不能查看也不能创建删除
[root@localhost ~]# ls -l /etc/
总用量 1128
-rw-r--r--.  1 root root       16 1月  27 2021 adjtime
-rw-r--r--.  1 root root     1518 6月   7 2013 aliases
-rw-r--r--.  1 root root    12288 1月  27 2021 aliases.db
drwxr-xr-x.  2 root root      280 2月   1 2021 alternatives
-rw-------.  1 root root      541 4月  11 2018 anacrontab
drwxr-xr-x.  3 root root       51 1月  29 2021 ansible
-rw-r--r--.  1 root root       55 10月 30 2018 asound.conf
drwxr-x---.  3 root root       43 2月   1 2021 audisp
drwxr-x---.  3 root root       83 2月   1 2021 audit
drwxr-xr-x.  2 root root       38 2月   1 2021 bash_completion.d
-rw-r--r--.  1 root root     2853 10月 31 2018 bashrc
drwxr-xr-x.  2 root root        6 10月 31 2018 binfmt.d
-rw-r--r--.  1 root root       38 11月 23 2018 centos-release
-rw-r--r--.  1 root root       51 11月 23 2018 centos-release-upstream
drwxr-xr-x.  2 root root        6 8月   4 2017 chkconfig.d
-rw-r--r--.  1 root root     1108 4月  13 2018 chrony.conf
-rw-r-----.  1 root chrony    481 9月  15 2017 chrony.keys
drwxr-xr-x.  2 root root       21 1月  27 2021 cron.d
drwxr-xr-x.  2 root root       42 1月  27 2021 cron.daily
-rw-------.  1 root root        0 4月  11 2018 cron.deny
drwxr-xr-x.  2 root root       22 6月  10 2014 cron.hourly
drwxr-xr-x.  2 root root        6 6月  10 2014 cron.monthly
-rw-r--r--.  1 root root      451 6月  10 2014 crontab

如何针对一个文件修改权限

chmod命令

u代表用户user

g代表组group

o代表其他other

r代表4

w代表2

x代表1

当给一个用户赋予权限时可以用字母,也可以用数字来操作

[root@localhost ~]# touch check.sh
[root@localhost ~]# ls -l check.sh 
-rw-r--r--. 1 root root 0 8月  11 22:14 check.sh
[root@localhost ~]# chmod 777 check.sh 
[root@localhost ~]# ls -l check.sh 
-rwxrwxrwx. 1 root root 0 8月  11 22:14 check.sh
#给check.sh赋予所有人读写执行的权限

[root@localhost ~]# chmod u=rwx,g=rw,o=r check.sh
[root@localhost ~]# ls -l check.sh
-rwxrw-r--. 1 root root 0 8月 11 22:14 check.sh

#给check.sh赋予拥有者读写执行,所属组读写,其他人读的权限

chown命令

chown命令主要用于修改文件或目录所属主和所属组

你想理解一个文件的权限,你必须要知道,一个文件的权限和文件的owner和group息息相关。
如何修改文件的owner和group
[root@localhost ~]# ls -l check.sh                
-rwxrw-r--. 1 root root 0 8月  11 22:14 check.sh
[root@localhost ~]# chown lizhifeng check.sh 
[root@localhost ~]# ls -l check.sh           
-rwxrw-r--. 1 lizhifeng root 0 8月  11 22:14 check.sh
#修改文件的属主为lizhifeng用户,也就输说lizhifeng这个用户对check.sh有rwx的权限,属于root组的用户对这个文件有rw的权限,其他用户对这个文件有r的权限
[root@localhost ~]# chgrp maint2 check.sh 
[root@localhost ~]# ls -l check.sh        
-rwxrw-r--. 1 lizhifeng maint2 0 8月  11 22:14 check.sh
#修改文件的数组为maint2,相对于上面来说,只有属于maint2这个组的用户才能对这个文件有rw权限

Linux的三种特殊权限

1. set UID

set UID可用于拥有可执行权限的普通文件,当文件被设置了set UID,任何人执行的时候都会被临时赋予文件拥有者的权限。
[lizf@BJ_Ansible_01 ~]$ ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /bin/passwd

当文件的权限拥有者位置出现s或者是S的时候,说明该文件有特殊权限,被设置了set UID 当用普通用户执行的时候会临时赋予root的用户权限。

chmod u+s FILE

2. set GID

set GID特殊权限应用于目录文件,当一个目录设置set GID特殊权限时, 任何用户在该目录下创建文件时,文件的所属组都会变成被设置set GID的那个目录的所属组。

在文件的所属组的权限列的执行权限位置,如果该位置执行位置变为s或者时S时,表示该文件目录被设置了set GID的特殊权限。

chmod g+s FILE

3.Sticky(粘位置)

针对于有写权限的目录文件,当一个有写权限的目录文件被设置了sticky特殊权限时,那么任何人在该目录下创建的文件只有目录的所有者和root可以删除。该特殊权限位,限制了目录的写权限。

如果其他人的权限列执行位置被设置成t或T,表示改目录文件被设置了Sticky特殊权限。

系统缺省权限设置umask

[root@localhost ~]# umask
0022

一般来说umask只看后3

创建目录的缺省权限是777

创建普通文件的权限是666

正常来说任何用户创建目录后,该目录的权限是rwxrwxrwx

任何用户创建普通文本文件,该文件的权限是rw-rw-rw-

普通文件如果带上执行权限,是不安全的. umask能帮助用户修改创建文件的默认权限。

 

umask的缺省权限设置需要将umask转换成权限,再去和缺省权限做减法,才能得到正确的创建文件权限。

创建目录的最终权限,就是目录777减去umask的后3位,root创建的目录权限应该是777-022=755

创建普通文件的最终权限,就是666减去umask的后3位,root创建的普通文件权限应该是666-022=644 

 普通用户创建的目录权限应该是777-002=775 普通用户创建的文件权限应该是666-002=664

umask可以修改的 

[root@localhost ~]# umask 0027
[root@localhost ~]# umask 
0027

不过这只是临时修改,想要永久修改就要写入配置文件login.defs