写在前面:3.16草稿,未发布。3.19补充部分内容,发布。
正文:
每一个文件都有拥有人与拥有群组的属性,每个登陆的使用者至少都会取得两个ID,一个是使用者ID(User ID,UID),
一个是群组ID(Group ID ,GID)。
当我们登陆Linux主机时,输入帐号,提出有显示文件属性的需求时,系统会依据/etc/passwd和/etc/group的内容,找到UID和GID对应的帐号与组名再显示出来。
那么,我们登陆主机取得shell环境时,系统都做了什么工作?
1,先查找/etc/passwd下是否有你输入的帐号。如果没有,就跳出,如果有,就将该帐号对应的UID和GID(位置上述)读取出来。还有该帐号的家目录以及shell配置。
2,核对口令表。Linux进入/etc/shadow上找相对应的帐号和UID,核实。
3,进入shell管控。
/etc/passwd文件结构
实例:(root账户)
root:x:0:0:root:/root:/bin/bash 这是一个帐号。
root 账户 x 口令 0 UID 0 GID root 用户信息说明栏 /root 家目录 /bin/bash :Shell
注意(这里之所以显示为x,是因为口令数据容易被窃取,放到了/etc/shadow中了)
/etc/shadow文件结构
实例:
root:$6$SqKt7MI2rBevNX9Y$qMt99CQMQWcdyEmbN9iH0fzXZd/A1f0bmI9blfXRWMuYsamKI3Dri4Zr.lDkTWDnjqQ2z/p2bglynWL80vDYM0:17606:0:99999:7:::
$SqKt7MI2rBevNX9Y$ : 这个是杂质(盐),就是为了放置密码被破解而采用的一种加密。无序排列,且更改密码,引起雪崩效应。
账户管理
useradd
-u:后面接的是UID,是一组数字。直接给一个特定的UID给这个帐号
-g:后面接的那个组名。
-G:后面接的是这个帐号还可以加入的群组
-M:强制不创建用户家目录
-m: 强制创建用户家目录
-r : 创建一个系统的帐号,这个帐号的UID会有限制
-s :后面接的是shell
栗子:
完全使用默认值创建一个用户
默认会创建用户家目录,且权限是700
我们使用的默认值创建,其实centos会帮我们处理几个项目:
在/etc/passwd里面创建一行与账号相关的数据,包括创建UID/GID/家目录等;
在/etc/shadow 里面将此账号的口令相关参数填入,但是尚未有口令;
在/etc/group 里面加入一个与账号名称一模一样的组名;
在/home 底下创建一个与账号同名的目录作为用户家目录,且权限为700
栗子::假设我已知道我的系统当中有个组名为users ,且UID 700 并不存在,请用users 为初始群组,以及uid为700 来创建一个名为user2 的账号
-u:后面接的是UID,是一组数字。直接给一个特定的UID给这个帐号
-g:后面接的那个组名。
栗子: 创建一个系统账号,user3
可以看到,user3并不存在home目录。
passwd
刚刚使用useradd创建了账号之后,在默认的情况下,该账号是暂时被封锁的。直接给他配置新口令。
-stdin : 透过来自前一个管道的数据,作为口令输入。
-l :lock的意思。将/etc/shadow第二栏最前面加上,使口令失效
-u:unlock
-S : 列出口令相关参数,就是说shadow文件的大部分信息
-n:后面接天数。shadow 的第4字段 多久不可修改口令天数
-X :后面接天数。shadow的第5字段,多久必须更动口令
-W : 后面接天数,shadow的第6字段,口令过期前的警告天数
-i :后面接日期,shadow的第7字段,口令失效日期
栗子:root给User2加上口令
提示密码太简单,但是还是修改成功了,这就是root账号修改的强大之处
补充(3.19):echo '111111' | passwd -stdin user1
usermod(一般直接在配置文件中修改)
userdel 删除
userdel -r user2
连家目录一块删除。
id (3.19补充)
id 这个命令则可以查询某人或自己的相关UID/GID 等等的信息,使用id 就全部都列出
只显示UID呢?
不显示user1,只显示UID
groupadd
-g : 后面接某个特定的GID
-r : 创建系统群组
ACL
使用场景:
myuser1 是projecta这个项目的助理,他需要这个项目的内容,但是他『不可以修改』项目目录内的任何数据!那该如何是好?你或许可以这样做:
将myuser1 加入projecta这个群组的支持,但是这样会让myuser1 具有完整的/srv/projecta的权限,myuser1 是可以删除该目录下的任何数据的!这样是有问题的;将/srv/projecta的权限改为775 ,让myuser1 可以进入查阅数据。但此时会发生所有其他人均可进入该目录查阅的困扰!这也不是我们要的环境。
提供传统的owner,group,others的read,write,exectute权限之外的细部权限配置。
getfacl : 取得某个文件、目录的acl配置项目
setfacl : 配置某个目录、文件的acl规范
setfacl命令用法
-m : 配置后续的acl参数给文件使用
-k :删除后续的acl参数
-b : 移除所有的acl配置参数
-k : 移除默认的acl参数
-R : 递归配置acl,就是包括次目录都会被配置起来
-d : 配置默认acl参数的意思。只对目录有效,在该目录新建的数据会引用此默认值。
1,针对特定使用者的方式
规范:u:使用者帐号列表:rwx
栗子:对User1的权限规范为rx
前提:touch acl_test1 user1创建
setfacl -m u:user1:rx acl_test1
无使用者列表,代表配置该文件拥有者。
上述为最简单的ACL 配置,利用『u:使用者:权限』的方式来配置的啦!配置前请加上-m 这个选项。如果一个文件配置了ACL 参数后,他的权限部分就会多出一个+ 号了!但是此时你看到的权限与实际权限可能就会有点误差!
这需要透过getfacl。
getfacl 命令用法
通过图片可以清晰的看出:显示了User:User1:r-x。
针对特定群组的方式:
配置规范:『g:[群组列表]:[rwx] 』,例如针对mygroup1 的权限规范rx
针对有效权限mask 的配置方式:
配置规范:『m:[rwx] 』,例如针对刚刚的文件规范为仅有r
user:user1 和 mask 按位与
group:users 和mask 按位与
最后得到真正的权限:r--