2. Linux用户管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. Linux用户管理相关的知识,希望对你有一定的参考价值。

1. 用户管理

1.1 用户信息相关文件

  1. ​/etc/passwd​​:存储用户的基本信息
    ​root:x:0:0:root:/root:/bin/bash​​用户名:密码占位符:UID:GID:描述:​
  • 用户名
  • 密码:都是​​x​​,因为密码不会直接存储在这里,而是位于​​/etc/shadow​​中密文存储
  • UID: User ID
  • 0:root
  • 1~499:系统用户
  • 1000+:普通用户
  • GID: Group ID,是基本组号,不是附加组号
  • 描述:描述用户的信息,例如manager
  • 家目录:该用户​​~​​所代表的目录位置
  • 登录启动项:如果不是​​shell​​类基本都会禁止登录的,规范禁止登录是:​​/sbin/nologin​
  1. ​/etc/shadow​​:存储用户的密码信息,man 5 shadown
    ​root:$6$FmCdybiez6x.G9mb$6Ny6JZ9TDEiCxv4NfWRxkTWsQaOAs.4F4JcZo1q15a070QW0PdbPc4knPFXY6DzHfEplm.OEu86WQ6yw0QEZ//:18587:0:99999:7:::​只需要前两项即可,后续了解即可
  • 用户名
  • 口令:某种算法运算之后的结果
  • 为空则是没有口令
  • ​*​​开头代表用户被锁定
  • ​!!​​开头代表这个密码已过期,密码前面直接加入​​!!​​就会使其过期。
  • ​$6​​开头代表是SHA-512加密
  • ​$1​​开头MD5加密【Hash】
  • ​$2​​开头Blowfish加密
  • ​$5​​开头SHA-256加密
  • ​salt​​:加盐
  • 最后一次修改时间:从1970年1月1日算起到最后一次修改的天数
  • 最小间隔:就是最小的可以修改密码的时间间隔,默认是0,代表随时可以修改
  • 最大时间间隔:就是最大的必须修改密码的时间间隔,默认是99999,代表可以永远不修改
  • 警告时间:提示修改密码的时间
  • 不活动时间:用户不登录系统的最大时间,超过该时间未登录就禁用用户
  • 失效时间:用户多少天失效,之后就不可用了
  • 保留
  1. ​/etc/group​​:存储组信息
    ​root:x:0:​
  • 组名
  • 组密码
  • GID
  • 组成员:默认为空,可有多个

root组成员和root有类似的权限,但是建议别这样使用,因为超级管理员一个程序只需要有一个。

  1. ​/etc/gshadow​​:存储组密码,一般不用

1.2 操作用户

1.2.1 创建用户

$ useradd username # 用户名username不能重名,adduser也是一样的功能
# -u UID: 用户ID
# -g gid: 基本组
# -G gid1[,gid2[,...]]: 附加组
# -c: 注释信息,其实是全名
# -d /path/to/user-home:指定用户家目录
# -s /bin/bash: 指定/etc/shells中的shell,或者/sbin/nologin
# -m: 自动创建家目录,常和-k连用
# -k: 将/etc/skel目录下的文件拷贝到创建的用户家目录,是bash的配置文件,默认是使用的
# -M: 不给用户创建家目录
root@basil-2020:/# useradd username
root@basil-2020:/# useradd username
useradd: user username already exists

1.2.2 查看新建用户信息

  1. ​id USERNAME​
root@basil-2020:/# id username
uid=1001(username) gid=1002(username) groups=1002(username)
  1. ​/etc/passwd​
$ grep USERNAME /etc/passwd
root@basil-2020:/# grep username /etc/passwd
username:x:1001:1002::/home/username:/bin/sh

$ tail -1 /etc/passwd # 新建的都在最后
root@basil-2020:/# tail -1 /etc/passwd
username:x:1001:1002::/home/username:/bin/sh
  1. ​finger USERNAME​
$ finger USERNAME            # 应该需要安装,查看用户账号信息
[root@localhost ~]# finger fedora
Login: fedora Name: Fedora Community
Directory: /home/fedora Shell: /bin/sh
Never logged in.
No mail.
No Plan.

1.2.3 修改用户密码

# --stdin     从标准输入输入命令
# -l 锁定账号
# -u 解锁账号
# -d 删除用户密码
$ passwd USERNAME # 如果直接只使用passwd,就是修改当前用户的密码
root@basil-2020:/# passwd username
New password:
Retype new password:
passwd: password updated successfully

# 修改用户密码过期时间
$ chage [OPTIONS] [USERNAME]

$ pwck # 检查用户账号完整性

1.2.4 查看用户

  1. 查看自己
$ whoami
root@basil-2020:/# su username
username@localhost: /$ whoami
username
  1. 查看所有登录用户
    ​-r​​:打印当前运行级别
$ who
# 用户 终端 启动时间
root tty1 2021-01-15 19:53
root pts/0 2021-01-15 19:56 (192.168.141.1)
root pts/1 2021-01-16 00:46 (192.168.141.1)
  1. 查看用户并看他们在做什么,类似​​who​​,更详细
$ w
03:55:11 up 8:01, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 19:53 5:43 0.07s 0.07s -bash
root pts/0 192.168.141.1 19:56 7.00s 0.73s 0.02s w
root pts/1 192.168.141.1 00:46 1:59 0.12s 0.01s bash
  1. ​last​​​ 可以查看用户登录历史,其实是显示​​/var/log/wtmp​​文件
    ​-n NUM​​​:只显示最近​​NUM​​次的登录信息
$ last
root pts/1 192.168.141.1 Sat Jan 16 00:46 still logged in
root pts/0 192.168.141.1 Fri Jan 15 19:56 still logged in
root tty1 Fri Jan 15 19:53 still logged in
...
  1. ​lastb​​​:显示​​/var/log/btmp​​文件,用户错误登录尝试
    ​-n NUM​​​:只显示最近​​NUM​​次的登录信息
$ lastb
root ssh:notty 192.168.141.1 Sat Jan 16 04:02 - 04:02 (00:00)
root ssh:notty 192.168.141.1 Sat Jan 16 04:02 - 04:02 (00:00)
root ssh:notty 192.168.141.1 Sat Jan 16 04:02 - 04:02 (00:00)
  1. ​lastlog​​​:显示当前系统每个用户最近一次成功登录信息
    ​-u USERNAME​​显示某个具体用户的登录信息
$ lastlog -u user1
Username Port From Latest
user1 pts/1 Sat Jan 16 03:52:43 -0500 2021
  1. ​basename​​:取得路径得基名
$  basename /etc/sysconfig/network-scripts/ifcfg-ens32
ifcfg-ens32

1.2.5 修改用户信息

# -u UID            用户ID
# -g GID 基本组
# -G GID[,GID2[,...]] 附加组,但是之前的就没有了,常和-a连用
# -a 不会删除之前加入的附加组
# -c 注释信息,是用户全名
# -d 新的家目录,常和-m连用
# -m 原家目录文件移动到新的家目录
# -l 修改登陆用户名
# -L 锁定用户账号,类似禁用
# -U 解锁用户账号
# -s 指定用户默认SHELL
# -r 添加系统账户,不登陆系统,没有家目录
$ usermod [OPTIONS] [USERNAME] # 基本和useradd一致,可以修改的信息,通过usermod --help或man user
root@basil-2020:~# usermod -s /sbin/nologin username # 不让用户登录
root@basil-2020:~# su - username
su: warning: cannot change directory to /home/username: No such file or directory
This account is currently not available.


# 修改用户账号注释信息,如全名
# 使用finger查看
$ chfn [USERNAME]

1.2.6 删除用户

# -r代表删除家目录HOME_DIR
$ userdel -r username
# 因为没有/home/username这个家目录,所以删除找不到,不过用户已经删除了
root@basil-2020:~# userdel -r username
userdel: username mail spool (/var/mail/username) not found
userdel: username home directory (/home/username) not found
root@basil-2020:/# id username
id: ‘username’: no such user

1.3 操作组

只用知道用户所处在哪些组,对应有哪些权限即可。

  • 私有组:随用户创建,组名同用户名一致。一个用户只能有一个基本组,而且也是​​/etc/passwd​​​中那个​​gid​​对应的
  • 基本组:用户的默认组
  • 附加组:后面用户加入的组

1.3.1 新建组

# -g        指定GID
# -r 创建系统组
$ groupadd GROUPNAME

1.3.2 查看组信息

$ grep GROUPNAME /etc/group
root@basil-2020:/# grep groupname /etc/group
groupname:x:1002:

$ tail -1 /etc/group
root@basil-2020:/# tail -1 /etc/group
groupname:x:1002:

1.3.3 组中增删用户及修改密码

$ gpasswd -a username GROUPNAME            # 添加用户
$ gpasswd -d username GROUPNAME # 移除用户
root@basil-2020:/# grep groupname /etc/group
groupname:x:1002:
root@basil-2020:/# gpasswd -a username groupname
Adding user username to group groupname
root@basil-2020:/# grep groupname /etc/group
groupname:x:1002:username
root@basil-2020:/# gpasswd -d username groupname
Removing user username from group groupname
root@basil-2020:/# grep groupname /etc/group
groupname:x:1002:

# 密码需要配合newgrp使用
$ newgrp GROUPNAME # 临时切换用户基本组为别的组,此时需要设置组的密码,退出即exit

1.3.4 修改组自身信息

# -g GID            指定GID
# -n GROUPNAME 修改组名
$ groupmod -g GID GROUPNAME # 修改组id
root@basil-2020:/# groupmod -g 1004 groupname
root@basil-2020:/# grep groupname /etc/group
groupname:x:1004:

1.4 切换用户以及​​sudo​

  • ​su - root​​​:切换用户到root,root可以不用写明,默认就是切换到root,​​-​​​也可以不用写明,但是建议一直写,因为带有和不带有​​-​​的区别是环境变量等是否可以沿用,带有就是沿用。
  • ​sudo​​:临时权限
  • 所有的用户如果可以使用​​sudo​​​需要位于​​wheel​​组中(CentOS,其它版本略有区别,例如lubuntu是admin或者就是sudo组)
  • 这个文件通过​​vim /etc/sudoers​​​查看,但是修改就需要使用​​visudo​​​命令来进行了,这个命令打开使用的是nano软件,所以看下面提示,那个​​^​​是Ctrl键。
  • ​%wheel ALL=(ALL) ALL​
  • 组名 用户机器=和谁权限一致 权限

2. 权限管理

2.1 基本权限UGO

2.1.1 概述

User、Group、Other

超级管理员决定某个计算机用户是否能够访问某个资源。

2.1.2 设置权限的两个基本元素

  • 权限对象
  • u:属主
  • g:属组
  • o:其他人
  • a:所有人=u+g+o,特殊对象
  • 权限类型
  • r:读=4
  • w:写=2
  • x:执行=1

2.1.3 修改用户权限

# -R                递归修改权限
# --reference=other-file file 根据other-file来修改权限
# a可以不用加,直接+rwx或者-rwx
$ chmod -R u+r 1.txt
# 命令 对象符号权限 文件或者目录,对象和权限的类型如上,符号有+、-、=
# -R 代表迭代,针对目录下所有的目录下所有文件都会该表权限
root@basil-2020:/tmp# touch file1
root@basil-2020:/tmp# mkdir dir1
root@basil-2020:/tmp# ll
drwxr-xr-x 2 root root 4096 14 14:42 dir1/
-rw-r--r-- 1 root root 0 14 14:40 file1
root@basil-2020:/tmp# chmod u=r file1 # 用户权限为r
root@basil-2020:/tmp# ll file1
-r--r--r-- 1 root root 0 14 14:40 file1
root@basil-2020:/tmp# chmod g=rwx file1 # 对于同组用户改其权限为rwx
root@basil-2020:/tmp# ll file1
-r--rwxr-- 1 root root 0 14 14:40 file1*
root@basil-2020:/tmp# chmod o= file1 # 对于other用户去掉所有权限
root@basil-2020:/tmp# ll file1
-r--rwx--- 1 root root 0 14 14:40 file1*
root@basil-2020:/tmp# chmod a-wx file1 # 对于所有用户去掉写和执行权限
root@basil-2020:/tmp# ll file1
-r--r----- 1 root root 0 14 14:40 file1
root@basil-2020:/tmp# chmod ug=rw,o=r file1 # 这里需要注意,后面不能有空格
root@basil-2020:/tmp# ll file1
-rw-rw-r-- 1 root root 66 14 15:06 file1

# 使用数字
root@basil-2020:/tmp# chmod 751 file1
root@basil-2020:/tmp# ll file1
-rwxr-x--x 1 root root 66 14 15:06 file1*

目录必须具有执行权限,因为进入目录属于执行,而修改(删除、更新或新建)目录中的内容属于写。

root@basil-2020:/tmp/test# ls -l
$ ls -l /tmp/test # 切换到basil用户并查看目录
ls: cannot access /tmp/test/file: Permission denied
-????????? ? ? ? ? ? file # 由于有读的权限,所以可以列出文件名,但是具体内容看不到
basil@basil-2020:/tmp$ cd test # 尝试进入目录
cd: permission denied: test
root@basil-2020:/tmp# chown basil /tmp/test # 改变目录属主为basil,再次执行上述命令
root@basil-2020:/tmp# ls -ld /tmp/test
drwxr--r-- 2 basil root 4096 15 10:38 /tmp/test
basil@basil-2020:/tmp$ ls -ld /tmp/test
drwxr--r-- 2 basil root 4096 15 10:38 /tmp/test
basil@basil-2020:/tmp$ ls -l /tmp/test
-rw-r--r-- 1 root root 0 14 17:09 file
basil@basil-2020:/tmp$ cd test
basil@basil-2020:/tmp/test$ ls -l
-rw-r--r-- 1 root root 0 14 17:09 file

2.1.4 修改属主和属组

# -R                递归修改
# --reference=otherfile file 修改成和otherfile一样的属主和属组
$ chown USERNAME[.GROUPNAME] FILE/DIRECTORY # 可以改变属主和属组,如果用户名中或者群组中有`.`,则可以使用`:`作为替换分割属主和属组符
root@basil-2020:/tmp# ll file1
-rwxr-x--x 1 root root 66 14 15:06 file1*
root@basil-2020:/tmp# chown username.groupname file1 # 改变属主和属组
root@basil-2020:/tmp# ll file1
-rwxr-x--x 1 username groupname 66 14 15:06 file1*
root@basil-2020:/tmp# chown root file1 # 改变属主
root@basil-2020:/tmp# ll file1
-rwxr-x--x 1 root groupname 66 14 15:06 file1*
root@basil-2020:/tmp# chown .root file1 # 改变属组
root@basil-2020:/tmp# ll file1
-rwxr-x--x 1 root root 66 14 15:06 file1*

# -R
# --reference
$ chgroup GROUPNAME FILE/DIRECTORY # 只改变属组
root@basil-2020:/tmp# chgrp groupname file1
root@basil-2020:/tmp# ll file1
-rwxr-x--x 1 root groupname 66 14 15:06 file1*

文件的权限、属主不只是取决于其自身的权限和属主,还取决于其目录的拥有者对于目录的权限,例如一个用户​​basil​​​对于目录​​path​​​拥有​​rwx​​​的权限,但是该目录下有一个​​root.sh​​​的文件,属主是root,但是用户​​basil​​仍然对其可以删除。

root@basil-2020:/tmp/path# ls -ld /tmp/path/     # path的详细信息
drwxrwxr-x 2 basil basil 4096 15 10:17 /tmp/path/
root@basil-2020:/tmp/path# chmod 600 root.sh # 修改权限
root@basil-2020:/tmp/path# ls -l
-rw------- 1 root root 24 15 10:24 root.sh # root.data的详细信息
basil@basil-2020:/tmp/path$ ./root.sh # 切回basil用户,尝试执行
zsh: permission denied: ./root.sh
basil@basil-2020:/tmp/path$ cat ./root.sh # 尝试读取
cat: ./root.sh: Permission denied
basil@basil-2020:/tmp/path$ rm -rf ./root.sh # 执行删除
basil@basil-2020:/tmp$ ls -l # 非basil用户的文件
-rw-r--r-- 1 root root 0 14 17:09 file
basil@basil-2020:/tmp$ rm -f ./file 执行删除
rm: cannot remove ./file: Operation not permitted

2.2 FACL

Filesystem Access Control List,文件访问控制列表,限制用户对文件的访问。利用文件的扩展属性,保存额外的访问控制权限。

权限应用次序:​​Owner→facl,user→Group→facl,group→Other​

$ getfacl /path/to/file                  # 查看文件的权限
root@basil-2020:/tmp# ll file1 # 查看文件详细信息
-rwxr-x--x 1 root groupname 66 14 15:06 file1*
root@basil-2020:/tmp# getfacl /tmp/file1 # 查看文件权限
getfacl: Removing leading / from absolute path names
# file: tmp/file1
# owner: root
# group: groupname
user::rwx
group::r-x
other::--x


# set file acl, 设置文件访问控制 对象:对象名:权限,对象是ugo,对象名则是对应的用户名,组名
# -m [u:UID:permission | g:GID:permission]:设置权限。设置默认的访问控制列表,需要在u|g之前加入`d`,只能给目录设置。
# -x [u:UID | g:GID]:取消权限
# -b:取消所有facl权限
# --mask:指定mask
$ setfacl -m g:groupname:rwx /tmp/file1
root@basil-2020:/tmp# setfacl -m u:alice:rw /tmp/file1 # 设置用户的权限
root@basil-2020:/tmp# setfacl -m u:bob:r-x /tmp/file1
root@basil-2020:/tmp# setfacl -m o::r /tmp/file1 # 这里有两个:
root@basil-2020:/tmp# ll /tmp/file1
-rwxrwxr--+ 1 root 1004 66 14 15:06 /tmp/file1* # 这里的+号表示的是除了基础权限还有其它权限,即ACL设置的权限
root@basil-2020:/tmp# getfacl /tmp/file1
getfacl: Removing leading / from absolute path names
# file: tmp/file1
# owner: root
# group: 1004
user::rwx
user:alice:rw-
user:bob:r-x
group::r-x
mask::rwx # 设置的facl权限不能超过这个,超过了也没有权限
other::r--

$ setfacl -x g:groupname:rwx /tmp/file1 # 删除组groupname的ACL权限
root@basil-2020:/tmp# setfacl -x u:alice /tmp/file1 # 删除用户alice的ACL权限
root@basil-2020:/tmp# getfacl /tmp/file1
getfacl: Removing leading / from absolute path names
# file: tmp/file1
# owner: root
# group: 1004
user::rwx
user:bob:r-x
group::r-x
mask::r-x
other::r--

$ setfacl -b /tmp/file1 # 删除所有ACL权限
root@basil-2020:/tmp# setfacl -b /tmp/file1 # 删除所有ACL权限
root@basil-2020:/tmp# getfacl /tmp/file1
getfacl: Removing leading / from absolute path names
# file: tmp/file1
# owner: root
# group: 1004
user::rwx
group::r-x
other::r--

$ watch -n5 ls -l /tmp/file1 # 新开一个终端,然后输入,这样每隔5秒钟就会执行后续命令

2.3 特殊权限

2.3.1 特殊位

是基本权限之前的那一位,即​​xxxx​​​四位八进制数的第一位,表示下面三种权限。
SUID/SGID,特殊命令需要超级管理员权限,位于属主的执行位,针对文件/程序时,具备临时提升权限,即调用文件的用户临时具备属主的能力。

SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者。如非必要不要给​​s​​​权限。对应​​4​​​。
SGID:运行某程序时,相应进程的基本组属组是程序文件自身的属组,而不是启动者的基本组。对应​​​2​​​。
Sticky:在一个公共目录,每个用户都可以创建文件,删除自己的文件,但是不能删除其它用户的文件。对应​​​1​​。

$ chmod u±s FILENAME      # 增加s权限,如果原来有x权限,则显示为`s`, 否则显示为`S`
$ chmod g±s FILENAME # 同上
$ chmod o±t DIR # 增加t权限,如果原来有x权限,则显示为`t`, 否则显示为`T`
root@basil-2020:~# vi /root/file.txt           # 在root的家目录创建的文件,除了root自己,谁都看不成
root@basil-2020:~# ls -ld /root # 注意权限,除了root,剩下用户都没有权限
drwx------ 6 root root 4096 14 16:35 /root
root@basil-2020:~# ls -l
total 4
-rw-r--r-- 1 root root 4 14 16:35 file.txt
root@basil-2020:~# su basil # 切换到basil用户
basil@basil-2020:/root
$ cat /root/file.txt
cat: /root/file.txt: Permission denied # 确认无法访问
basil@basil-2020:/root
$ exit # 退回root用户
root@basil-2020:~# ll /usr/bin/cat # 查看cat的权限
-rwxr-xr-x 1 root root 43416 95 2019 /usr/bin/cat*
root@basil-2020:~# chmod u+s /usr/bin/cat # 给cat提权
root@basil-2020:~# ll /usr/bin/cat
-rwsr-xr-x 1 root root 43416 95 2019 /usr/bin/cat*
root@basil-2020:~# su basil # 切换到basil用户
basil@basil-2020:/root
$ cat /root/file.txt
123
root@basil-2020:~# chmod u-s /usr/bin/cat # 不要随便提权
root@basil-2020:~# ll /usr/bin/cat
-rwxr-xr-x 1 root root 43416 95 2019 /usr/bin/cat*

2.3.2 文件属性​​chattr​

如果一个文件很重要,那他万一被超管删除了怎么办?使用特殊的​​i​​权限,使得超级管理员用户也无法删除。

属性

描述

a(append)

允许在文件中进行追加操作,通常对于日志文件添加

A

这个属性不允许更行文件的访问时间

c(compressed)

启用这个属性时,文件在磁盘上会自动压缩

d(dump)

不能使用dump命令备份文件

D

设置了目录的D属性时,更改会在同步保存在磁盘上

e(extent for mat)

它表明,该文件使用磁盘上的块的映射扩展

i(immutable)

在文件上启用这个属性时,我们不能更改、重命名或者删除这个文件

j(journaling)

在文件上启用这个属性时,不能更改、重命名或者删除这个文件

S(synchronous)

设置了这个属性时,变更或更改同步保存到磁盘上,就是volatile。

$ chattr +i /root/file.txt                    # chattr [+|-]i /path/to/file
root@basil-2020:/tmp# touch file.txt
root@basil-2020:/tmp# ll file.txt
-rw-r--r-- 1 root root 0 14 16:53 file.txt
root@basil-2020:/tmp# lsattr file.txt # lsattr /path/to/file
--------------e----- file.txt

# 添加i属性
root@basil-2020:/tmp# chattr +i file.txt
root@basil-2020:/tmp# ll file.txt
-rw-r--r-- 1 root root 0 14 16:53 file.txt
root@basil-2020:/tmp# lsattr file.txt
----i---------e----- file.txt

# 超级管理员权限下
# 尝试删除文件
root@basil-2020:/tmp# rm -rf file.txt
rm: cannot remove file.txt: Operation not permitted
# 尝试修改文件
root@basil-2020:/tmp# echo "Hello " >> file.txt
-bash: file.txt: Operation not permitted
# 尝试重命名
root@basil-2020:/tmp# mv file.txt file01.txt
mv: cannot move file.txt to file01.txt: Operation not permitted

# 移除i属性
root@basil-2020:/tmp# chattr -i file.txt
root@basil-2020:/tmp# echo "Hello " >> file.txt
root@basil-2020:/tmp# cat file.txt
Hello
root@basil-2020:/tmp# rm -rf file.txt

2.3.3 进程掩码​​umask​

新建文件的默认权限是644,新建目录的默认权

以上是关于2. Linux用户管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux用户权限管理命令

用户和组

Linux命令之设置普通用户具有超级管理员权限sudo

linux 用户管理

Linux超级用户和管理组

Linux学习:进入与退出系统