保证系统的安全:文件与用户的权限 & 用户口令的设置
Posted wanao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保证系统的安全:文件与用户的权限 & 用户口令的设置相关的知识,希望对你有一定的参考价值。
导图整理
文件属性与权限
文件操作
chown
# chown [-R] username file/dir # chown [-R] username:groupname file/dir -R:递归的改变目录下的文件和子目录 注意:username:groupname中的冒号也可以使用小数点.代替:username.groupname,但是当username或groupname中带小数点时会引起歧义。
chgrp
# chgrp [-R] dirname/filename -R:递归的改变该目录下的所有文件和目录的所属组 注意:被改变的组名必须存在于/etc/group文件中
chmod
方法一:数字类型改变文件权限 r—4 w—2 x—1 # chmod [-R] xyz file/dir -R : 递归的改变目录下的文件和子目录 xyz:所有者、所属组、其他用户的权限表示数字 方法二:符号类型改变文件权限
文件权限
(r,w,x)
文件属性
文件和目录的权限意义
umask
umask:用来设置所创建文件和目录的默认权限。umask只是个掩码,它会屏蔽掉不想授予的权限,要把umask值从对象的预设全值减掉,得到的才是对象的默认权限。
目录和文件在默认权限的属性上是不同的,x权限对目录非常重要,但是一般文件的建立不需要执行权限,因此预设如下:
- 文件:预设没有可执行权限,只有rw,最大为666 :-rw-rw-rw-
- 目录:预设所有权限开放,即777:drwxrwxrwx
[root@localhost ~]# umask 0022
第一位:特殊权限
后三位:rwx权限
[root@localhost ~]# umask -S u=rwx,g=rx,o=rx
隐藏权限
隐藏权限可以使用chattr设置,lsattr查看(最重要的属性就是将其设定为不可修改的特性,包括文件拥有着都不能修改, 在重要文件上加上不可更改属性有利于系统的安全性)
# chattr [+-=] [ASacdistu] filename/dirname 常用参数: a:文件只能增加数据,而不能删除或修改数据(只有root才能设定该属性) i:文件不能被删除、修改、新增数据,设定链接也无法写入,对系统数据安全具有重要作用(只有root才能设定该属性)
# lsattr [-adR] filename/dirname 常用参数: -a:将隐藏文件的属性也显示出来 -d:若接的是目录,则仅列出目录本身的属性 -R:连同子目录的数据一并列出
特殊权限
SUID
当 s 标志出现在文件拥有者的x权限上时,不要怀疑,就是SUID特殊权限,它的功能是:
- SUID权限仅对二进制程序有效;
- 执行者对于该程序需要具有x权限;
- SUID权限仅在执行该程序的过程中有效;
- 执行者将具有该程序拥有者的权限。
例如:/etc/shadow文件只有root可读且仅有root可以修改,那么普通用户如何通过passwd去修改/etc/shadow文件?
[root@localhost tmp]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 Jan 30 2014 /usr/bin/passwd
- 普通用户对/usr/bin/passwd具有x权限;
- passwd的拥有者是root;
- 普通用户执行passwd过程中,由于passwd程序使用了SUID,使得普通用户在执行期间暂时获得root的权限;
- /etc/shadow可以被普通用户执行的passwd 修改。
SGID
当s标志出现在了文件所属组的x权限的时候,嗯,是SGID权限了,它的功能是:
- 对文件所属组的x权限设置:
- SGID对二进制文件有用;
- 执行者具备该文件的x权限;
- 执行者在执行过程中得到该程序群组的支持。
- 对目录所属组的x权限设置:
- 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
- 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若用户在此目录下具有 w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此目录的群组相同。
SBIT(Sticky Bit)
当t标志出现在了文件的其他人的x权限的时候,SBIT来了,SBIT目前只针对目录有效,SBIT对目录的作用是:
- 当用户对于此目录具有写入权限时,该用户在此目录下建立文件或目录时,仅有自己与root才有权利删除该文件。
用户管理
用户相关文件
/etc/passwd
/etc/passwd文件中记录了用户的登陆信息,每行代表一个用户,使用:分隔成七项;添加或删除一个用户最基础的操作就是在passwd文件中添加或删除个人纪录。
[root@bogon ~]# tail -n 5 /etc/passwd avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin letty:x:1000:1000:letty:/home/letty:/bin/bash
用户名称:密码:UID:GID:用户说明或注释:家目录:Shell
/etc/shadow
/etc/passwd文件中的密码区段只是一个x符号,真正的密码在/etc/shadow文件中,并在该文件中加入了很多密码限制参数。
[root@bogon ~]# head -n 4 /etc/shadow root:$6$gtpYPVVaFSp084pP$oERiAZADTS3MmBtNg8K6wwCAb16Lz4SZL1U4KdIoW7sjQdnuiuDTPf8nWBHsaKUxu33g3GS9wyftSfbA09I3q0::0:99999:7::: bin:*:17703:0:99999:7::: daemon:*:17703:0:99999:7::: adm:*:17703:0:99999:7:::
- 账号名称
- 经过加密后的密码:固定的编码系统产生的密码长度必须一致,当该字段的长度改变,密码就会失效。因此,在该字段加上 !或 * 改变密码字段长度会让密码暂时失效。因此检查/etc/shadow中的空口令用户可以:# awk -F ":" ‘($2=="!"){print $1}‘ /etc/shadow
- 从1970年1月1日起到密码上一次被更改的时间
- 密码不可变更的天数:如果为0则意为可以随时变更,如果为6表示6天内不可以变动密码
- 密码需要重新变更的天数:必须在指定天数内重新设定密码,否则账号的密码将被变为过期属性
- 密码需要变更期限前的警告天数:默认为一周,当密码有效期限快到的时候,系统会依据这个字段的设定给账号发出警告
- 密码过期后的账号宽限时间:密码过期后登入系统时系统会强制要求重设密码,否则在账号宽限时间后密码将会失效(再也无法使用改密码登入系统)
- 账号失效日期:该账号在此字段规定的日期后将无法再使用(账号失效)将该字段设置为0可以使得该账号无法使用,但是所有跟账号相关的数据都会留下来。
- 保留字段
/etc/group
[root@bogon ~]# head -n 4 /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3:
组名:群组密码:GID:此群组支持的账号名称
/etc/gshadow
[root@bogon ~]# head -n 4 /etc/gshadow root::: bin::: daemon::: sys:::
组名:群组密码(为!或为空时表示该群组不具有群组管理员):群组管理员的账号(gpasswd):加入该群组支持的所属账号
群组相关操作
基本上群组的相关操作都与/etc/group,/etc/gshadow两个文件有关。
groupadd
# groupadd [-g gid] [-r] groupname 参数: -g:接GID -r:建立系统群组
groupmod
# groupmod [-g Gid] [-n group_name] groupname 参数: -g:修改既有的GID -n:修改既有的组名
groupdel
# groupdel [groupname]
注意:删除群组要确定/etc/passwd内的账号没有人使用该群组作为初始群组。
gpasswd
# gpasswd groupname # gpasswd [-A user1,...] [-M user3,...] groupname # gpasswd [-rR] groupname 参数: 若没有任何参数,则表示给予groupname一个密码(/etc/shadow) -A:将groupname的主控权交给后面的使用者管理(设置群组管理员) -M:将某些账号加入这个群组中 -r:将groupname的密码移出 -R:使groupname的密码字段失效
# gpasswd [-ad] user groupname
参数:
-a:将user加入groupname群组
-d:将user移出groupname群组
newgrp
newgrp 指令类似 login 指令,当它是以相同的帐号,另一个群组名称,再次登入系统。欲使用 newgrp 指令切换群组,必须是该群组的用户,否则将无法登入指定的群组。单一用户要同时隶属多个群组,需利用交替用户的设置。若不指定群组名称,则 newgrp 指令会登入该用户名称的预设群组。
用户相关操作
useradd
# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-d 家目录绝对路径] [-s shell] 用户名 参数: -u:UID,/etc/passwd第三个字段 -g:GID,/etc/passwd第四个字段 -G:后接该账号还可以加入的组名,/etc/group第四个字段 -c:用户说明,/etc/passwd第五个字段 -d:指定用户的家目录(不使用默认值),/etc/passwd第六个字段 -s:后接一个shell(默认/bin/bash),/etc/passwd第七个字段 -M:不建立用户家目录(系统账户默认值) -m:建立用户家目录(一般账户默认值) -r:建立系统账户 -e:后接日期[YYYY-MM-DD],/etc/shadow第八个字段(账号失效日期)
-f:后接/etc/shadow的第七个字段,指定密码何时失效(0:立刻失效,-1:永不失效)
使用useradd建立账户系统的默认值会主动处理如下几个项目:
- 在/etc/passwd建立一行与账号相关数据,包括UID/GID/家目录等;
- 在/etc/shadow将此账号的密码相关参数填入;
- 在/etc/group加入一个与账户相同名称的组名;
- 在/home下建立一个与账户同名的目录作为用户家目录,且权限为700。
useradd参考文件
[root@bogon ~]# useradd -D GROUP=100 预设的群组 HOME=/home 默认的家目录所在目录 INACTIVE=-1 密码失效日(-1永不失效) EXPIRE= 账号失效日 SHELL=/bin/bash 预设的shell SKEL=/etc/skel 用户家目录的内容数据参考目录 CREATE_MAIL_SPOOL=yes 是否主动帮助使用者建立邮箱
[root@bogon ~]# cat /etc/login.defs UID_MIN 1000 一般用户最小的UID UID_MAX 60000 一般用户最大的UID SYS_UID_MIN 201 保留给用户自行设定系统账号的最小UID SYS_UID_MAX 999 保留给用户自行设定系统账号的最大UID GID_MIN 1000 一般用户自定义组的最小GID GID_MAX 60000 一般用户自定义组的最大GID SYS_GID_MIN 201 保留给用户自行设定的系统账号最小 GID SYS_GID_MAX 999 保留给用户自行设定的系统账号最大 GID CREATE_HOME yes 是否主动建立用户家目录 UMASK 077 用户家目录建立的umask USERGROUPS_ENAB yes 使用userdel删除时是否删除初始群组 ENCRYPT_METHOD SHA512 密码加密机制:sha512
usermod
使用useradd后如果某些地方需要修改,可以选择直接去/etc/passwd或/etc/shadow文件下直接去修改相应字段的数据,也可以使用usermod命令:
# usermod [-cdefgGa] [-LUsu] username 参数: -c:添加用户账户的备注信息 -d:用户家目录 -e:接日期YYYY-MM-DD,/etc/shadow的第八个字段(账户过期日期) -f:接天数,/etc/shadow的第七个字段(密码过期前的账号宽限天数) -g:接初始群组,修改/etc/passwd第四个字段(GID) -G:接次要群组,修改/etc/# usermod [-cdefgGa] [-LUsu] username 参数: -c:添加用户账户的备注信息 -d:用户家目录 -e:接日期YYYY-MM-DD,/etc/shadow的第八个字段(账户过期日期) -f:接天数,/etc/shadow的第七个字段(密码过期前的账号宽限天数) -g:接初始群组,修改/etc/passwd第四个字段(GID) -G:接次要群组,修改/etc/group的第四个字段(使用者支持的群组) -a:与-G连用可增加次要群组的支持,而非设定 -l:接账户名称,修改账户名称/etc/passwd第一栏 -s:接shell -u:接UID -L:冻结用户密码(修改/etc/shadow密码栏) 与passwd -l相同 -U:解冻用户密码(将/etc/shadow密码字段中的!拿掉) 与passwd -u相同
userdel
# userdel [-r] username
-r:连同用户家目录一起删除
删除用户的相关数据有:
- 用户账号/密码相关参数:/etc/passwd、/etc/shadow
- 使用者群组相关参数:/etc/group、/etc/gshadow
- 用户个人文件数据:/home/username、/var/spool/mail/username..
访问控制列表ACL
ACL(Access Control List,访问控制列表),ACL可以针对单一使用者、单一文件或目录进行权限规范。
setfacl & getfacl
# setfacl [-bkRd] [{-m | -x} acl参数] 目标文件名 参数: -m:设定后续的ACL参数 -x:删除后续的ACL参数 -b:移除所有的ACL设定参数 -k:移除预设的ACL参数 -R:递归设定ACL(包括次目录) -d:设定预设ACL参数(只对目录有效,在该目录新建的数据会引用此默认值)
针对特定用户设定ACL: u:[使用者列表]:[rwx] (使用者为空表示设定该文件拥有者)
针对特定群组设定ACL: g:[群组列表]:[rwx]
针对有效权限设定ACL: m:[rwx] 通过mask来规范最大允许的权限
使用默认权限设定目录未来文件的ACL权限继承: d:[u|g]:[user|group]:权限
用户身份切换
su
# su [-lm] [-c 指令] [username] -:su -代表使用login-shell的变量文件读取方式来登入系统 -l:与-类似,但后面需要加欲切换的使用者账号 -m:使用目前的环境设定,不读取新使用者的配置文件 -c:仅执行一次指令
sudo
一开始系统默认仅有root可以执行sudo,在安装系统的时候设定一般用户的项目中,如果选择了让该用户成为管理员,那么除了root该用户也可以使用 sudo。
# sudo [-b] [-u username] 参数: -b:将后续指令放在后台让系统自动执行,不与目前的shell产生影响 -u:后接要切换的使用者(无此选项默认切换为root)sudo可以通过 -u 切换到系统账号来执行命令(su就不可以)
sudo预设仅有root能够使用,sudo执行流程如下:
- 1. 当用户执行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;
- 2. 若使用者具有可执行 sudo 的权限后,便让使用者输入用户自己的密码来确认;
- 3. 若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);
- 4. 若欲切换的身份与执行者身份相同,那也不需要输入密码。
visudo与/etc/sudoers
除了 root 之外的其他账号,若想要使用 sudo 执行属于 root 的权限指令,则 root 需要先使用 visudo 去修改 /etc/sudoers ,让该账号能够使用全部或部分的 root 指令功能。 visudo 利用 vi 将 /etc/sudoers 文件呼叫出来进行修改:
# visudo root ALL=(ALL) ALL [使用者账号] [登入者的来源主机名] [可切换的身份] [可下达的指令]
利用wheel群组以及免密码功能处理visudo
# visudo %wheel ALL=(ALL) ALL %表示群组之意 # usermod -a -G wheel username 将username加入wheel群组就能使用sudo命令切换任何身份来操作任何指令
# visudo
%wheel ALL=(ALL) NOPASSWD: ALL NOPASSWD关键字意味着免除密码输入
利用别名设置visudo
[root@study ~]# visudo <==注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2 Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root ADMPW ALL=(root) ADMPWCOM
注意:能够使用sudo的用户必须是能够信任的用户。
PAM模块
PAM(Pluggable Authentication Modules,插件式鉴别模块)机制采用模块化设计和插件功能,使得我们可以轻易地在应用程序中插入新的鉴别模块或替换原先的组件,而不必对应用程序做任何修改。应用程序可以通过 PAM API 方便的使用 PAM 提供的各种鉴别功能,而不必了解太多的底层细节。
PAM 为了实现其插件功能和易用性,它采取了分层设计思想:让各鉴别模块从应用程序中独立出来,然后通过PAM API作为两者联系的纽带,这样应用程序就可以根据需要灵活地在其中"插入"所需鉴别功能模块,PAM 的体系如下简图所示:
当应用程序调用 PAM API 时,应用接口层按照配置文件 pam.conf(/etc/pam.d 存放了各个需要pam验证的应用程序的配置文件) 的规定,加载相应的鉴别模块。然后把请求(从应用程序那里获得的参数)传递给底层的鉴别模块,这时鉴别模块就可以根据要求执行具体的鉴别操作了。当鉴别模块执行完相应操作后,将结果返回给应用接口层,然后由接口层根据配置的具体情况将来自鉴别模块的应答返回给应用程序。
用户口令的设置
passwd
# passwd [-luSnxwi] [--stdin] [username] 参数: --stdin:允许通过标准输入修改用户密码:echo ”NewPasswd“ | passwd --stdin Username -l:锁定用户禁止其登陆 -u:解锁用户允许其登陆 -S:显示用户密码是否被锁定,以及密码采用的加密算法名称 -n:密码不可变更的天数,/etc/shadow第四栏
-x:密码需要重新设定的天数,/etc/shadow第五栏
-w:密码过期前的警告天数,/etc/shadow第六栏
-i:密码失效日期,/etc/shadow第八栏
chage
# chage [-ldmMWIE] Username 参数: -l:列出该账号的详细密码参数 -d:接日期YYYY-MM-DD,修改/etc/shadow第三字段(最近一次更改密码的日期) -m:接天数,修改/etc/shadow第四字段(密码不可更改的天数) -M:接天数,修改/etc/shadow第五字段(密码需要变更的天数) -W:接天数,修改/etc/shadow第六字段(密码过期前警告天数) -I:接天数,修改/etc/shadow第七字段 -E:接日期YYYY-MM-DD,修改/etc/shadow第八字段(账号失效日期)
通过chage设置账号第一次登陆系统系统默认密码,但必须更改过密码后使用新密码才能登陆系统使用的bash环境:
[root@bogon ~]# chage -d 0 letty 将密码建立时间设置为1970/01/01会有问题 [root@bogon ~]# chage -l letty Last password change : password must be changed Password expires : password must be changed Password inactive : password must be changed Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
当letty用户再次登陆时,系统提示用户使用与用户名相同的密码登陆,登陆后立即更改密码,更改密码完成后被踢出系统使用新密码重新登陆。
密码参数参考文件
[root@bogon ~]# cat /etc/login.defs | grep PASS
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
PASS_MAX_DAYS 99999 /etc/shadow第五栏,指定天数变更密码
PASS_MIN_DAYS 0 /etc/shadow第四栏,指定天数内不可变更密码
PASS_MIN_LEN 5 密码最短的字符长度(已被pam取代)
PASS_WARN_AGE 7 /etc/shadow第六栏,过期前会警告的天数
PAM模块进行密码检验
PAM管理密码的机制写在/etc/pam.d/passwd中,该文件与密码相关的测试模块是使用:pam_cracklib.so,这个模块会检验密码相关的信息,并取代/etc/login.defs内的PASS_MIN_LEN的设定。
执行passwd后,该程序呼叫PAM的流程是:
- 用户开始执行/usr/bin/passwd,并输入密码;
- passwd呼叫PAM模块进行验证;
- PAM模块会到/etc/pam.d寻找与程序passwd同名的配置文件;
- 依据 /etc/pam.d/passwd 内的设定,引用相关的 PAM 模块逐步进行验证分析;
- 将验证结果 (成功、失败以及其他讯息) 回传给 passwd 这支程序;
- passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证)
[root@bogon ~]# cat /etc/pam.d/passwd #%PAM-1.0 auth include system-auth account include system-auth password substack system-auth -password optional pam_gnome_keyring.so use_authtok password substack postlogin
验证类别 控制标准 PAM模块与该模块的参数
每一行都是一个独立的验证流程。
为了系统的安全性,密码设定要求最好如下:
- 密码不能与账号相同;
- 密码尽量不要选用字典里会出现的字符串;
- 密码长度要超过8个字符;
- 密码不要使用个人信息;
- 密码尽量使用大小写字母、数字、特殊字符的组合。
以上是关于保证系统的安全:文件与用户的权限 & 用户口令的设置的主要内容,如果未能解决你的问题,请参考以下文章