关于文件的安全我们要从3A验证 说起


    1  Authentication:认证 

    2  Authorization:授权 

    3  Accouting|Audition:审计


由于系统文件的用户太多为了便于管理 我们便把系统的用户 进行分类 赋予权限 合理地分配资源 所以今天介绍的是 系统用户 用户组 的一些权限的 分配 修改 和文件的 权限修改 和赋权 以及一些特殊权限的用法


用户的分类


管理员:root 0  

普通用户:1-65535 

系统用户:1-499(CENTOS6) 1-999 对守护进程获取资源进行权限分配 

登录用户:500(CENTOS6)+ 1000+ 

交互式登录


用户组的分类 


Linux组:Groupname/GID 

管理员组:root 0  

普通组有 系统组:1-499  1-999 和普通组:500+  1000+


linux的安全上下文


运行中的程序:进程 (process) 以进程发起者的身份运行: root: /bin/cat mage: /bin/cat 进程所能够访问资源的权限取决于进程的运行者的身份所以我们会针对不同的用户 和用户组 分配不同的权限以便更好地进行系统的运行


Linux用户和组的类别


用户的主要组(主组): 用户必须属于一个且只有一个主组 组名同用户名 且仅包含一个用户:私有组 用户的附加组(辅助组): 一个用户可以属于零个或多个辅助组



用户和组的配置文件

Linux用户和组的主要配置文件: 

/etc/passwd:用户及其属性信息(名称、UID、主组ID等) 

/etc/group:组及其属性信息 

/etc/shadow:用户密码及其相关属性

/etc/gshadow:组密码及其相关属性


文件的格式


passwd 文件格式


login name:登录用名(wang) 

passwd:密码 (x)

UID:用户身份编号 (1000) 

GID:登录默认所在组编号 (1000) 

GECOS:用户全名或注释 

home directory:用户主目录 (/home/wang) 

shell:用户默认使用shell (/bin/bash)


passwd 和gpasswd的用法


passwd [OPTIONS] UserName: 修改指定用户的密码,仅 root用户权限 

passwd: 修改自己的密码;  常用选项: 

-l:锁定指定用户 

-u:解锁指定用户 

-e:强制用户下次登录修改密码 

-n mindays: 指定最短使用期限 

-x maxdays:最大使用期限 

-w warndays:提前多少天开始警告 

-i inactivedays:非活动期限; 

–stdin:从标准输入接收用户密码; 

echo "PASSWORD" | passwd –stdin USERNAME


组密码:gpasswd gpasswd [OPTION] GROUP 

-a user: 将user添加至指定组中; 

-d user: 从指定组中移除用户user 

-A user1,user2,…: 设置有管理权限的用户列表 

newgrp命令:临时切换基本组; 如果用户本不属于此组,则需要组密码


密码的加密机制

加密:明文–> 密文 解密:密文–> 明文  

单向加密:哈希算法,原文不同,密文必不同 相同算法定长输出,获得密文不可逆推出原始数据 雪崩效应:初始条件的微小改变,引起结果的巨大改变 

   md5: message digest, 128bits 

    sha1: secure hash algorithm, 160bits 

    sha224: 224bits s

    ha256: 256bits 

    sha384: 384bits 

    sha512: 512bits  

    更改加密算法 authconfig –passalgo=sha256 –update



shadow文件格式 


登录用名 

用户密码:一般用sha512加密 

从1970年1月1日起到密码最近一次被更改的时间 

密码再过几天可以被变更(0表示随时可被变更) 

密码再过几天必须被变更(99999表示永不过期) 

密码过期前几天系统提醒用户(默认为一周) 

密码过期几天后帐号会被锁定 

从1970年1月1日算起,多少天后帐号失效


group文件格式


群组名称:就是群组名称  

群组密码:通常不需要设定,密码是被记录在 /etc/gshadow 

GID:就是群组的 ID 以当前组为附加组的用户列表(分隔符为逗号)


gshdow文件格式


群组名称:就是群组名称 :群组密码:  组管理员列表:组管理员的列表,更改组密码和成员  以当前组为附加组的用户列表:(分隔符为逗号)


用户和组管理命令以及 用户创建 创建用户 用户属性修改  和删除用户


第一 创建用户 

默认值设定:/etc/default/useradd文件中  

显示或更改默认设置: useradd -D useradd –D -s SHELL


第二用户创建


useradd [options] LOGIN 

  -u UID: [UID_MIN, UID_MAX]定义在/etc/login.defs -o 配合-u 选项,不检查UID的唯一性 

  -g GID:指明用户所属基本组,可为组名,也可以GID -c "COMMENT":用户的注释信息 

  -d HOME_DIR: 以指定的路径(不存在)为家目录 

  -s SHELL: 指明用户的默认shell程序 可用列表在/etc/shells文件中 

  -G GROUP1[,GROUP2,…]:为用户指明附加组,组必须事先存 在 

  -N 不创建私用组做主组,使用users组做主组 

  -r: 创建系统用户 CentOS 6: ID<500,CentOS 7: ID<1000


第三用户属性修改


 usermod [OPTION] login 

    -u UID: 新UID 

    -g GID: 新基本组 

    -G GROUP1[,GROUP2,…[,GROUPN]]]:新附加组,原来的附加 组将会被覆盖;若保留原有,则要同时使用-a选项,表示append; 

    -s SHELL:新的默认SHELL; 

    -c 'COMMENT':新的注释信息; 

    -d HOME: 新家目录不会自动创建,原家目录中的文件不会同时移 动至新的家目录;若要创建新家目录并移动原家数据,同时使用-m选项 

    -l login_name: 新的名字; 

    -L: lock指定用户,在/etc/shadow 密码栏的增加 ! 

    -U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉

    -f INACTIVE: 设定非活动期限;


第四删除用户


userdel [OPTION]… login -r: 删除用户家目录


接下来介绍一下如何批量创建用户 以及修改命令口令


1 /etc/default/useradd

2 /etc/skel/*

3 /etc/login.defs

  newusers  passwd格式文件 批量创建用户

  chpasswd  批量修改用户口令


当你创建完用户时你可以查看查看用户相关的ID信息 


id [OPTION]… [USER] 

  -u: UID 

  -g: GID 

  -G: Groups 

  -n: Name


如何切换用户或以其他用户身份执行命令


su [options…] [-] [user [args…]] 

切换用户的方式: su UserName:

非登录式切换,即不会读取目标用户的 配置文件,不改变当前工作目录 

su – UserName:登录式切换,会读取目标用户的配置 文件,切换至家目录,

完全切换 root su至其他用户无须密码;非root用户切换时需要密码  换个身份执行命令: 

su [-] UserName -c 'COMMAND' 

选项:-l  –login: 

su -l UserName 相当于 su – UserName


用户组的创建修改和删除 以及密码的修改


第一创建组


groupadd [OPTION]… group_name 

  -g GID: 指明GID号;[GID_MIN, GID_MAX] 

  -r: 创建系统组; CentOS 6: ID<500 CentOS 7: ID<1000


第二修改和删除组


组属性修改:groupmod groupmod [OPTION]… group 

  -n group_name: 新名字 

  -g GID: 新的GID;

组删除:groupdel groupdel GROUP


第三更改组密码


组密码:gpasswd gpasswd [OPTION] GROUP 

  -a user: 将user添加至指定组中; 

  -d user: 从指定组中移除用户user 

  -A user1,user2,…: 设置有管理权限的用户列表 

  newgrp命令:临时切换基本组; 如果用户本不属于此组,则需要组密码


如何更改和查看组成员


groupmems [options] [action] options: 

   -g, –group groupname 更改为指定组 (只有root) Actions: 

   -a, –add username      指定用户加入组 

   -d, –delete username    从组中删除用户 

   -p, –purge                从组中清除所有成员 

   -l, –list                   显示组成员列表 

   groups [OPTION].[USERNAME]… 查看用户所属组列表


文件的 三类用户权限 和三种特殊权限 以及 ACL:Access Control List,实现灵活的权限管理 


文件的权限主要针对三类对象进行定义: 

owner: 属主, u group: 属组, g other: 其他, o 

每个文件针对每类访问者都定义了三种权限: r: Readable w: Writable x: eXcutable


文件: 

r: 可使用文件查看类工具获取其内容 

w: 可修改其内容 

x: 可以把此文件提请内核启动为一个进程 

目录: 

r: 可以使用ls查看此目录中文件列表 

w: 可在此目录中创建文件,也可删除此目录中的文件 

x: 可以使用ls -l查看此目录中文件列表,可以cd进入此 

目录 X:只给目录x权限,不给文件x权限【前提是子目录中的文件 没有执行权限】


权限的计算

--- 000 0 

--x 001 1 

-w-010 2 

-wx 0113 

 r--100 4 

r-x 101 5 

rw- 110 6 

rwx 111 7 

例如: 640: rw-r----r

       wxr-xr-x: 755


修改文件权限


chmod [OPTION]… OCTAL-MODE FILE… 

-R: 递归修改权限 

chmod [OPTION]… MODE[,MODE]… FILE… MODE: 修改一类用户的所有权限: u=  g= o= ug=  a= u=,g= 修改一类用户某位或某些位权限 u+  u- g+ g- o+ o- a+ a- + 

chmod [OPTION]… –reference=RFILE FILE… 参考RFILE文件的权限,将FILE的修改为同RFILE;


权限设置


chgrp  sales testfile 

chown  root:admins  testfile 

chmod  u+wx,g-r,o=rx file 

chmod  -R g+rwX /testdir 

chmod  600  file 

chown mage testfile


三种文件系统中的特殊权限 SUID, SGID, Sticky  简称权限的继承


SUID权限 


任何一个可执行程序文件能不能启动为进程:取决发起者对 程序文件是否拥有执行权限 启动为进程之后,其进程的属主为原程序文件的属主 SUID只对二进制可执行程序有效 SUID设置在目录上无意义 权限设定: chmod u+s FILE… 

chmod u-s FILE…


SGID权限


 任何一个可执行程序文件能不能启动为进程:取决发起者对 程序文件是否拥有执行权限  启动为进程之后,其进程的属主为原程序文件的属组 

权限设定: chmod g+s FILE… 

           chmod g-s FILE…


目录上的SGID权限


默认情况下,用户创建文件时,其属组为此用户所属的主组  一旦某目录被设定了SGID,则对此目录有写权限的用户在此 目录中创建的文件所属的组为此目录的属组  通常用于创建一个协作目录  

权限设定: chmod g+s DIR… 

           chmod g-s DIR…


Sticky 位 


具有写权限的目录通常用户可以删除该目录中的任何 文件,无论该文件的权限或拥有权 在目录设置Sticky 位,只有文件的所有者或root可 以删除该文件 sticky 设置在文件上无意义 

权限设定: chmod o+t DIR… 

           chmod o-t DIR… 

例如:  ls -ld /tmp drwxrwxrwt 12 root root 4096 Nov 2 15:44 /tmp


特殊权限数字法


SUID SGID STICKY 

000 0 

001 1 

010 2 

011 3 

100 4 

101 5 

110 6 

111 7 

chmod 4777 /tmp/a.txt

通过此公式可算出特殊权限的值


因为上面所见到的权限具有局限性 只能服务于三类用户所以就有了后来的ACL权限设置法如下


ACL:Access Control List,实现灵活的权限管理  除了文件的所有者,所属组和其它人,可以对更多的用户设 置权限 CentOS7.0默认创建的xfs和ext4文件系统有ACL功能。 CentOS7.X之前版本,默认手工创建的ext4文件系统无ACL 功能。需手动增加: tune2fs –o acl /dev/sdb1 mount –o acl /dev/sdb1  /mnt ACL生效顺序:所有者,自定义用户,自定义组,其他人


以及为多用户或者组的文件和目录赋予访问权限rwx 

 mount -o acl /directory 

 getfacl  file |directory 

 setfacl  -m  u:wang:rwx file|directory 

 setfacl  -Rm g:sales:rwX directory 

 setfacl  -M  file.acl file|directory 

 setfacl  -m  g:salesgroup:rw file| directory 

 setfacl  -m  d:u:wang:rx  directory 

 setfacl  -x  u:wang  file |directory 

 setfacl  -X file.acl  directory





课后作业


在/data/testdir里创建的新文件自动属于yun1组,组yun2的成员如:alice能对这些新文件有读写权限,组yun3的成员如:tom只能对新文件有读权限,其它用户(不属于yun1,yun2,yun3)不能访问这个文件夹。


[root@localhost ~]# groupadd yun1

[root@localhost ~]# groupadd yun2

[root@localhost ~]# groupadd yun3

[root@localhost ~]# mkdir -p /data/testdir

[root@localhost ~]# chown -R :yun1 /data/testdir

[root@localhost ~]# ll -d /data/testdir

[root@localhost ~]# chmod 770 /data/testdir

[root@localhost ~]# ll -d /data/testdir

[root@localhost ~]# useradd -G yun2 alice

[root@localhost ~]# useradd -G yun3 tom

[root@localhost ~]# setfacl -m g:yun2:rw /data/testdir

[root@localhost ~]# setfacl -m g:yun3:r /data/testdir

[root@localhost ~]# getfacl /data/testdir

[root@localhost ~]# ll -d /data/testdir/

电脑演示


[root@localhost Desktop]# groupadd yun1

[root@localhost Desktop]# groupass yun2

bash: groupass: command not found

[root@localhost Desktop]# groupadd yun2

[root@localhost Desktop]# groupadd yun3

[root@localhost Desktop]# mkdir -p /data/testdir

[root@localhost Desktop]# chown -R :yun1 /data/testdir

[root@localhost Desktop]# ll -d /data/testdir

drw-r–r–. 2 root yun1 4096 Aug  3 08:41 /data/testdir

[root@localhost Desktop]# chmod u+rwX/data/testdir

chmod: missing operand after `u+rwX/data/testdir'

Try `chmod –help' for more information.

[root@localhost Desktop]# chmod 770 /data/testdir

[root@localhost Desktop]# ll -d /data/testdir

drwxrwx—. 2 root yun1 4096 Aug  3 08:41 /data/testdir

[root@localhost Desktop]# useradd -G g2 alice

useradd: group 'g2' does not exist

[root@localhost Desktop]# useradd -G yun2 alice

[root@localhost Desktop]# useradd -G yun3 tom

[root@localhost Desktop]#  setfacl -m g:yun2:rw /data/testdir

[root@localhost Desktop]# setfacl -m g:yun3:r /data/testdir

[root@localhost Desktop]# getfacl /data/testdir

getfacl: Removing leading '/' from absolute path names

# file: data/testdir

# owner: root

# group: yun1

user::rwx

group::rwx

group:yun2:rw-

group:yun3:r–

mask::rwx

other::—


[root@localhost Desktop]# ll -d /data/testdir/

drwxrwx—+ 2 root yun1 4096 Aug  3 08:41 /data/testdir/

[root@localhost Desktop]# 




创建组sales,gid 3000,passwd:centos,sales admins:dada2

将用户dada1,dada2,dada3加入到sales辅助组

希望dada1 创建新文件 默认的所属组为sales

dada2将用户dada3从sales组移除

删除sales,dada1,dada2


[root@localhost ~]# groupadd -g 3000 sales

[root@localhost ~]# gpasswd sales

[root@localhost ~]# useradd -G sales dada2

[root@localhost ~]# gpasswd -A dada2 sales

[root@localhost ~]# useradd -G sales dada1

[root@localhost ~]# useradd -G sales dada3

[root@localhost ~]# usermod -g sales dada1

[root@localhost ~]# su – dada1

[user1@localhost ~]$ touch f1.txt

[user1@localhost ~]$ ll f1.txt 

[user1@localhost ~]$ exit

[root@localhost ~]# su – dada2

[user2@localhost ~]$ gpasswd -d dada3 sales

[user2@localhost ~]$ exit

[root@localhost ~]# userdel -r dada1

[root@localhost ~]# userdel -r dada2

[root@localhost ~]# groupdel sales


电脑演示


[root@localhost Desktop]# groupadd -g 3000 sales

groupadd: group 'sales' already exists

[root@localhost Desktop]# gpasswd sales

Changing the password for group sales

New Password: 

Re-enter new password: 

[root@localhost Desktop]# useradd -G sales dada2

[root@localhost Desktop]# gpasswd -A dada2 sales

[root@localhost Desktop]# useradd -G sales dada1

[root@localhost Desktop]# useradd -G sales dada3

[root@localhost Desktop]#  usermod -g sales dada1

[root@localhost Desktop]#  su – dada1

[dada1@localhost ~]$ touch tiantain.txt

[dada1@localhost ~]$  ll tiantian.txt

ls: cannot access tiantian.txt: No such file or directory

[dada1@localhost ~]$ touch f1.txt

[dada1@localhost ~]$ ll f1.txt

-rw-r–r–. 1 dada1 sales 0 Aug  3 09:22 f1.txt

[dada1@localhost ~]$ exit

logout

[root@localhost Desktop]# su – dada2

[dada2@localhost ~]$ gpasswd -d dada3 sales

Removing user dada3 from group sales

[dada2@localhost ~]$ exit

logout

[root@localhost Desktop]# userdel -r dada1

userdel: group dada1 not removed because it is not the primary group of user dada1.

[root@localhost Desktop]# userdel -r dada2

[root@localhost Desktop]# groupdel sales

[root@localhost Desktop]#