UID 和 GID
虽然我们登陆 Linux
系统时,输入的是帐号,但是其实电脑并不会直接识别帐号名称,它仅认识 ID
而已。
每个登陆用户至少都会取得两个 ID
,一个是用户ID(User ID ),一个是群组ID(Group ID)。文件是如何知道它是属于哪个用户和群组呢?其实就是通过 UID
和 GID
。
用户
/etc/passwd
这个文件的结构:每一行代表一个用户帐号,每一行的内容使用冒号 :
隔开,总共有 7 项内容:
1.用户名称
2.密码,由于历史原因,密码栏都是 x
,真正的密码在 /etc/shadow
中;
3.UID,特别的,root
用户的 UID
是 0
,1-999
是系统帐号;
4.GID,对应 /etc/group
中的 GID
;
5.备注
6.家目录
7.Shell
/etc/shadow
这个文件主要与用户密码相关,结构和 /etc/passwd
类似,每一行代表一个用户密码和限制条件:
1.用户名称;
2.密码,注意是经过加密的密码;
3.最近更换密码的日期;
4.密码不可更换的天数;
5.密码需要更换的天数;
6.密码需要更换期限前的警告天数;
7.密码过期后的帐号宽限时间;
8.帐号失效日期;
9.保留;
群组
/etc/group
这个文件记录 GID
与群组名称的对应关系。
vi /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
每一行代表一个群组,以冒号 :
作为分隔符,总共有 4 栏,每个栏位的意义是:
- 群组名称
- 群组密码
- GID
- 该群组所包含的用户名称,如果有多个用户,用逗号
,
隔开,不要有空格
有效群组和初始群组
初始群组(Initial group)
当用户一登陆系统,立刻就拥有这个群组的相关权限。
可以通过查看 /etc/passwd
文件里面用户的 GID
确定初始群组。使用者一登陆就会主动取得,不需要在 /etc/group
文件的第 4 个栏位中写入该群组。
CentOS 用
useradd <username>
命令创建用户时默认会创建一个和username
同名的用户组,所以一般用户的初始群组就是和用户名同名的群组。
有效群组(Effective group)
假如有一个用户 lc
,由于是使用 useradd <username>
命令创建的,现在 lc
这个用户的初始群组是 lc
。如果它要加入到 users
组中,那么必须要在 /etc/group
文件中找到 users
那一行,将 lc
这个用户加到第 4 栏当中,这样 lc
就加入了 users
群组中。如果一个用户不止加入一个群组,用逗号 ,
隔开即可。
切换有效群组
groups
如何知道一个用户属于哪些群组呢?可以使用命令 groups
,结果如下:
[lc@localhost~]$ groups
lc users
上面输出的信息显示用户 lc
同时属于 lc
和 users
两个群组。同时,还有一个隐含的信息:第一个输出的群组为有效群组。也就是说, 目前用户 lc
的有效群组是 lc
。此时,如果我以 touch <filename>
新建一个文件,这个文件的拥有者是 lc
,群组也是 lc
。
[lc@localhost~]$ touch test
[lc@localhost~]$ ll test
-rw-rw-r-- lc lc test
通常有效群组的作用就是新建文件时。
newgrp
那么有效群组是否可以切换呢?
我想把有效群组切换到 users
,此时可以使用 newgrp
命令,这个命令可以变更目前用户的有效群组。
[lc@localhost~]$ newgrp users
[lc@localhost~]$ groups
users lc
[lc@localhost~]$ touch test2
[lc@localhost~]$ ll
-rw-rw-r-- lc lc test
-rw-r--r-- lc users test2
[lc@localhost~]$ exit # !!!注意,要离开 newgrp 的环境!
上面输出的信息显示有效群组已经变更为 users
了
newgrp
命令也是有限制的,切换的群组必须是该用户所属的群组。如果想切换的sshd
群组,但是因为lc
并不属于sshd
群组,此时是无法完成切换的。
另外,newgrp
命令是以另外一个shell
来提供功能的,这个新的shell
中用户lc
的有效GID
为users
。所以想要回到原来的环境中,输入exit
即可回到原来的shell
。
/etc/gshadow
这个文件的作用是建立群组管理员,和 /etc/group
一样也是使用冒号 :
作为分隔符,每一栏的含义如下:
1.群组名称
2.密码栏。密码栏为叹号 !
或者为空
表示该群组没有群组管理员
3.群组管理员的帐号
4.该群组所属的用户
由于目前有类似
sudo
这样的工具,所以群组管理员的功能已经很少使用了。
帐号管理
新增和删除用户
新增用户
使用系统默认值新增用户,操作如下:
useradd <username>
默认值内容包括:
- 在
/etc/passwd
裡面建立一行與帳號相關的資料,包括建立 UID/GID/家目錄等; - 在
/etc/shadow
裡面將此帳號的密碼相關參數填入,但是尚未有密碼; - 在
/etc/group
裡面加入一個與帳號名稱一模一樣的群組名稱; - 在
/home
底下建立一個與帳號同名的目錄作為使用者家目錄,且權限為 700
useradd -D
命令可以查看默认值
有特殊需求的新增用户操作如下:
useradd -u <uid> -g <groupname> <username>
这里我们指定了新增用户的 uid
,指定了一个已经存在的群组作为使用者的初始群组。
密码设定
以上新增了用户之后,在默认情况下,该用户是锁定无法登陆的,需要使用 passwd
命令设定密码才可以使用
passwd <username>
特别的,如果
passwd
不加参数,意思是修改root
用户的密码。
设置密码校验:PAM模块
Pluggable Authentication Modules
PAM 是独立的 API,任何程序有验证需求时,都可以向 PAM 发出验证请求,PAM 经过一系列的验证之后,将验证结果返回给程序。
passwd
使用的就是 pam_cracklib.so
模块,如果我们输入字典中可以找到的字符串, passwd
就会有报错提示。
passwd
验证执行流程:
1.执行 /usr/bin/passwd
命令;
2.passwd
调用 PAM
模块进行验证;
3.PAM
模块会到 /etc/pam.d/
寻找与 passwd
同名的配置文件;
4.根据 /etc/pam.d/passwd
内的配置,引用相关的 PAM
模块逐步进行验证;
5.将验证结果会传给 passwd
;
6.passwd
程序会根据 PAM
会传的结果决定下一步动作(重新设置密码或者通过验证)。
pam.pwquality.so
已经取代pam_cracklib.so
,完全兼容,并且提供/etc/security/pwquality.conf
配置文件额外提供默认值。
设置密码复杂度
pam_cracklib.so
支持的部分选项:
retry=N
:定义登录/修改密码失败时,可以重试的次数
minlen=N
:新密码的最小长度
dcredit=N
:当 N>0
时表示新密码中数字出现的最多次数;当N<0时表示新密码中数字出现最少次数;
ucredit=N
: 当 N>0
时表示新密码中大写字母出现的最多次数;当N<0时表示新密码中大写字母出现最少次数;
lcredit=N
: 当N>0
时表示新密码中小写字母出现的最多次数;当N<0时表示新密码中小写字母出现最少次数;
ocredit=N
:当N>0
时表示新密码中特殊字符出现的最多次数;当N<0时表示新密码中特殊字符出现最少次数;
maxrepeat=N
:拒绝包含多于N个相同连续字符的密码。 默认值为0表示禁用此检查
maxsequence=N
:拒绝包含长于N的单调字符序列的密码。默认值为0表示禁用此检查。实例是 '12345'
或 'fedcb'
。除非序列只是密码的一小部分,否则大多数此类密码都不会通过简单检查。
enforce_for_root
: 如果用户更改密码是root,则模块将在失败检查时返回错误。默认情况下,此选项处于关闭状态,只打印有关失败检查的消息,但 root
仍可以更改密码。不要求root用户输入旧密码,因此不会执行比较旧密码和新密码的检查
修改 /etc/pam.d/system-auth
文件:
[root@localhost~]$ vi /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 ucredit=-1 lcredit=-1 ocredit=-1 dcredit=-1 enforce_for_root
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
找到 pam_pwquality.so
后面加上需要验证的参数:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 ucredit=-1 lcredit=-1 ocredit=-1 dcredit=-1 enforce_for_root
设置密码到期时间
修改 /etc/login.defs
文件:
PASS_MAX_DAYS 180 #密码最长过期天数
PASS_MIN_DAYS 0 #密码最小过期天数
PASS_MIN_LEN 8 #密码最小长度
PASS_WARN_AGE 7 #密码过期警告天数
以上是针对新增用户的设置,如果是已有用户不受影响,需要使用以下命令修改已有用户的密码到期时间:
# 先查看密码过期和失效策略
passwd -S lc
# 也可以使用 chage 命令查看
chage -l lc
# 修改密码过期时间,设置180天过期
passwd -x 180 lc
设置多次输入密码错误锁定用户
编辑 /etc/pam.d/sshd
文件:
[root@localhost~]$ vi /etc/pam.d/sshd
#%PAM-1.0
auth required pam_tally2.so deny=5 unlock_time=1200 even_deny_root root_unlock_time=1200
...
参数说明:
even_deny_root
:也限制 root
用户;
deny
:设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
unlock_time
:设定普通用户锁定后,多少时间后解锁,单位是秒;
root_unlock_time
:设定root用户锁定后,多少时间后解锁,单位是秒;
注意,配置需要写在第一行
$ ssh root@120.25.226.1
# 错误密码
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
root@120.25.226.1's password:
Permission denied, please try again.
# 正确密码
root@120.25.226.1's password:
Permission denied, please try again.
从上面的输出信息可以看到 ,在尝试 5 次错误密码登录之后,几十使用正确密码也无法登录了,需要的等待 20 分钟解锁。
设置终端连接超时时间
设置 TMOUT
环境变量,30 分钟超时:
[root@localhost~]$ echo $TMOUT # 先确定是否有该环境变量
[root@localhost~]$ vi /etc/profile
export TMOUT=1800 # 30分钟超时
[root@localhost~]$ source /etc/profile
锁定和解锁用户
# 使某个用户失效,无法登陆
passwd -l lc
# 恢复
passwd -u lc
修改用户资料
usermod [-cdegGlsuLU] <username>
参数:
-c :後面接帳號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些帳號的說明。
-d :後面接帳號的家目錄,即修改 /etc/passwd 的第六欄;
-e :後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個欄位資料啦!
-f :後面接天數,為 shadow 的第七欄位。
-g :後面接初始群組,修改 /etc/passwd 的第四個欄位,亦即是 GID 的欄位!
-G :後面接次要群組,修改這個使用者能夠支援的群組,修改的是 /etc/group 囉~
-a :與 -G 合用,可『增加次要群組的支援』而非『設定』喔!
-l :後面接帳號名稱。亦即是修改帳號名稱, /etc/passwd 的第一欄!
-s :後面接 Shell 的實際檔案,例如 /bin/bash 或 /bin/csh 等等。
-u :後面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
-L :暫時將使用者的密碼凍結,讓他無法登入。其實僅改 /etc/shadow 的密碼欄。
-U :將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
删除用户
userdel [-r] <username>
参数:
-r :同时删除用户的家目录
# 删除用户 `lc`,同时删除家目录
[root@localhost~]$ userdel -r lc
想要彻底清除某个用户留下的痕迹,可以在删除之前通过
find / -user <username>
命令查找整个系统中数据该用户的文件,然后再删除,这样可以比较彻底地删除用户文件。
新增和删除群组
新增群组
groupadd [-g] [-r] <groupname>
参数:
-g : 指定特定的 GID
-r : 新增系统群组
groupadd lcgroup
删除群组
groupdel <groupname>
网友评论