linux文件权限和用户组

文件权限

1. linux文件权限

(一)linux文件属性

ls -l 命令可以看到文件相关属性,每个字段的意义如下:

  • chown

    语法:chown [OPTION]… [OWNER][:[GROUP]] FILE…

    -R 递归

  • chgrp 设置文件所属组

    -R 递归

    chgrp的功能chown也能够实现

(二)linux文件权限

linux定义了以下三类用户:

所有者 (owner,u)

所属组 (group,g)

其他人 (other,o)

linux文件为每类用户规定了三种权限

读权限 (readable,r)

写权限 (writable,w)

可执行权限 (executable,x)

三种权限在文件与目录中的不同效果

文件:

  • r: 可以查看文件内容
  • w: 可以修改文件内容
  • x: 可以被系统运行

目录:

  • r: 可以通过ls命令查看目录内文件列表
  • w: 可以在目录下新建、删除文件
  • x: 可以通过cd命令进入目录内
  • X:只给目录x权限,不给文件x权限

2.文件权限描述方法

用户描述:u:所有者,g:所属组,o:其他人,a:所有三类用户

权限变化描述:+:增加权限,-:减少权限,=:将权限赋值

u+w:所有者增加写权限

g-x:所属组减少可执行权限

a=rw:所有用户的权限赋值为读、写权限

1rwx 7=4+2+1       
2rw- 6=4+2+0
3r-x 5=4+0+1    
4r-- 4=4+0+0
5-wx 3=0+2+1   
6-w- 2=0+2+0   
7--x 1=0+0+1
8--- 0=0+0+0

chmod 修改文件权限

chmod [OPTION]… MODE[,MODE]… FILE…

chmod [OPTION]… OCTAL-MODE FILE…

选项:-R 递归设置

3.umask值:新建文件和目录的默认权限

umask默认值:root用户为022,普通用户为002

umask值计算新建文件和目录的权限的方法:

对于目录,用777-umask值即可

对于文件,用666-umask值后,将出现的奇数位权限值加1其他不变

4.linux文件特殊权限

一般来说,用户是否能够访问文件取决于被访问文件的权限设置。但是,linux文件的特殊权限(SUID,SGID)表现在:用户继承了访问文件使用的可执行程序文件的权限设置。

SUID

SUID : 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者

 1    chmod  u+s  file
 2    chmod  u-s  file
 3    chmod 4720 FILE...    用数值法描述时,在原三位数字前添加数字4
 4    
 5一、先看下/usr/bin/passwd这个文件,也就时命令passwd。
 6    -rwsr-xr-x. 1 root root 25980 2月  22 2012 /usr/bin/passwd
 7    发现这个文件的拥有者是root,并且其他组的权限为r-x,也就说普通用户对其具有r和x的权限。
 8二、既然普通用户对其具有执行权限,因此当普通用户执行这条命令时,由于s这个权限的存在,那么在执行过程中会暂时获取root的权限。
 9三、由于只有root才可以修改/etc/shadow文件,而在此次执行过程中已经得到了root用户的支持,因此密码会顺利得写入到这个文件中。
10如果file 本身原来就有执行权限,则suid显示s ,否则显示S

SGID

可执行文件上的SGID权限

SGID :运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组

1chmod g+s file
2chmod g-s file
3chmod 2770 FILE...    用数值法描述时,在原三位数字前添加数字2

实验:

1、当前普通用户(不属于natasha组)无法用cat命令访问abc文件

2、将cat程序文件的所属组改为abc文件的所属组natasha,并为其赋予SGID权限

3、此时普通用户可以访问abc文件了。这是因为执行cat命令时,普通用户的身份切换为cat命令文件的所属组,而abc文件的所属组与cat的相同并且具备读权限,所以普通用户也可以访问了。

1sgid  共享文件 案例
2#前提 是shared组成员。 可以用附加组搞定  
3#mkdir testdir
4#chgrp shared testdir
5#chmod g+s  testdir
6#umask  002
7#cd testdir
8#touch testfile   //新文件的属组 也是shared 。

Sticky 粘滞位

Sticky 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件

一般情况下,具有对目录写权限的用户可以删除目录下的任意文件,而不需考虑文件的所有者。

当对目录赋予Sticky权限,目录内的文件只能由其所有者和root用户删除,其他用户即使对目录具有写权限也不能删除别人的文件。

用法:

 1
 2chmod o+t DIR...     <!--先前位置的x会被t代替-->
 3chmod o-t DIR...     <!--t会恢复成x-->
 4chmod 1647 DIR...    <!--用数值法描述时,在原三位数字前添加数字1-->
 5举例:
 6[root@localhost tmp]# ls -al  /tmp
 7总用量 12
 8drwxrwxrwt.  9 root  root        4096 10月 27 10:30 .
 9
10/tmp 目录 就是这个有权限 ,
11这个权限可以控制避免被删除的作用
12特殊权限的大小写区别

SUID:

  • s:所有者拥有x权限
  • S:所有者没有x权限

SGID:

  • s:所属组拥有x权限
  • S:所属组没有x权限

Sticky:

  • t:其他人拥有x权限
  • T:其他人没有x权限

由于特殊权限都赋予在二进制可执行文件或目录上,这些文件的x权限都比较重要,失去x权限而赋予特殊权限,将无法实现很多功能,所以大写的权限一般视作一种故障状态。

1000
2001
3110
4111
51755   sticky          -001
62755   sgid            -010
73755   sgid   sticky   -011
85755   sticky  suid    -101
9umask  0022 有4位

5.设定文件特定属性

1chattr +i     不能删除,改名,更改
2chattr +a     只能追加内容
3lsattr        显示特定属性

6.ACL访问控制列表

ACL能够专门对个别用户进行权限控制,实现更加灵活的权限管理

CentOS 7下的分区自动具备ACL功能;

CentOS 6下的分区:若分区是在系统安装时划定的,则自动具备ACL功能;若分区是安装后增加的,则默认不具备ACL功能,需要手动修改。

手动开启ACL功能

1tune2fs –o acl /dev/sdb1
2mount  –o acl /dev/sdb1 /mnt/test
3setfacl 设置文件ACL

语法:setfacl [option] [{-m|-x} acl_spec] file …

用法

1 -m 修改 -x 删除 
2 option:-R 递归 -b 清空 -k 删除默认acl权限
3 u:hellopeiyang:rwx     设定用户hellopeiyang的所有者权限为rwx
4 g:natasha:rw     设定组natasha的所属组权限为rw
5 m::rw    设定mask值为rw
6 setfacl -m u:hellopeiyang:rw hello     设置文件hello的ACL权限为自定义用户拥有读写权限
7 setfacl -b hello     清空hello文件的ACL权限

mask值限定了ACL中除所有者、其他人外其他用户能够达到的最高权限。修改个别自定义用户、自定义组的权限会导致

umask值变化,进而影响其他权限,故umask只能在自定义用户与自定义组权限设置完毕后再统一调整。

getfacl 查看文件ACL getfacl file …

ACL生效顺序:所有者,自定义用户,自定义组,其他人

复制文件保留ACL设置:cp -p

 1 setfacl
 2	-m 设定
 3		u:uid:perm
 4		g:gid:perm
 5	-x 取消
 6setfacl  -m u:hadoop:rw  inittab  (inkttab 是root 用户,其他组没写权限)
 7专门给hadoop 设置读写权限
 8setfacl -m g:mygroup:rw  inittab
 9//取消
10setfacl  -x u:hadoop inittab

用户组

用户、组

用户

  • 系统在用户登录时为用户分配一个令牌便于权限管理,在linux系统中令牌即为UID

  • UID编码规则:

  • 系统用户:1-499(CentOS 6),1-999(CentOS 7)

  • 登录用户:500+(CentOS 6),1000+(CentOS 7)

  • root用户的UID为0,普通用户的UID为1-60000,其中系统用户与登录用户的分配如下:

  • 系统用户主要为系统运行的程序准备。

  • 系统为了方便管理,设立组的概念,组内用户的权限继承自组权限
  • 组同样设置GID,其编码规则同UID
  • 建立新用户时系统默认同时建立同名组,其UID和GID号相同

安全上下文

  • 进程所能够访问资源的权限取决于进程的运行者的身份

组的类别

  • 用户的主要组:一个用户有且只属于一个主组,默认其名称与用户名相同
  • 用户的辅助组:一个用户可以属于零个或多个辅助组

用户、组的配置文件

  • linux用户、组的配置文件主要如下四个
    • /etc/passwd 用户账号相关属性配置文件
    • /etc/shadow 用户密码相关属性配置文件
    • /etc/gpasswd 组账号相关属性配置文件
    • /etc/gshadow 组密码相关属性配置文件
  • passwd文件格式: name:passwd:UID:GID:GECOS:directory:shell
    • name: 用户登录名
    • passwd: 用户密码,现在密码已经移至/etc/shadow文件,被占位符x代替
    • UID: 用户ID号
    • GID: 用户所属的主组ID号
    • GECO: 用户信息注释
    • directory: 用户家目录路径
    • shell: 用户默认shell
  • shadow文件格式:login name:encrypted password:date of last password change:minimum password age:maximum password age:password warning period:password inactivity period:account expiration date:reserved field
    • login name:用户登录名
    • encrypted password: 加密的密码
    • $6代表加密方式为SHA512,加密方式很多,例如$1代表MD5加密
    • $AArU9fX$中两个$符号间是一段随机字符,称作盐(salt),用于确保即使是相同密码加密的结果也不同,进一步加强密码安全性
    • 后面的字符是加密密文正文,不同加密方式长度不同,但是只要加密方式相同,密码位数不同加密后的密文位数是相同的
    • 更改密码加密方式:authconfig --passalgo=sha256 --update
    • date of last password change: 上次修改密码时间,从1970-1-1起算的天数
    • minimum password age: 最短密码时间,普通用户更换密码的最短间隔天数,0表示随时可以变更
    • maximum password age: 最长密码时间,用户使用一个密码最长时间,99999表示永不过期
    • password warning period: 密码达到最长时间前提前报警提示的天数,默认7天
    • password inactivity period: 密码达到最长时间后允许修改密码的宽限期,超出后用户被锁定
    • account expiration date: 用户账户有效期,从1970-1-1起算的天数
  • group文件格式:group name:passwd:GID:user list
    • group name: 组名称
    • passwd: 组密码,用占位符x代替,加密密码移至/etc/gpasswd文件
    • GID: 组ID号
    • user list: 以当前组为辅助组的用户,多用户用,分隔
  • gshadow文件格式:group name:encrypted password:administrators:members
    • group name: 组名称
    • encrypted password: 加密的密码,与/etc/shadow文件中的密码加密方式相同
    • administrators: 组管理员,可以修改组密码,多名管理员用,分隔
    • members: 以当前组为辅助组的用户,内容必须与/etc/group文件中的user list相同
  • 注意: 修改账号相关设置(e.g. /etc/passwd /etc/shadow /etc/group /etc/gpasswd)时,必须重新登录才能够生效

用户和组管理命令

用户管理命令

useradd 用户创建
  • 语法:useradd [options] LOGIN 用法:

创建一个用户billy,指明UID=1010,属于附加组hellopeiyang和natasha,家目录为/app/billy,使用的shell为csh。

命令:useradd -u 1010 -G hellopeiyang,natasha -d /app/billy -s /bin/csh bill

getent命令检查hellopeiyang,natasha,billy三个组的/etc/group文件,确认用户列表存放的是以此组作为辅助组的用户

  • 用户创建默认配置文件 /etc/default/useradd

  • 使用useradd -D命令修改用户创建默认配置文件

  • 用户家目录默认配置文件 /etc/skel 使用useradd建立用户家目录时,将/etc/skel下的所有文件复制到家目录中,相当于执行命令cp -a /etc/skel/.[^.]* /home/user

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

  • cat 格式文件 | chpasswd 批量修改用户密码,格式文件格式user name:password

useradd -m username 创建家目录 和 linux 发行版本有关系。

usermod 用户属性修改

语法:usermod [OPTION] login

用法:

将billy用户的主组改为harry,附加组增加sarah,家目录迁移到/home/billy下,账号于2018年8月31日过期,最后将billy账户锁定

1getent group harry
2usermod -g 1004 -aG sarah -md /home/billy -e 2018-08-31 billy <!--注意a在G前,m在d前-->
3usermod -L billy

userdel 删除用户

1userdel login      删除login用户
2userdel -r login   删除login用户同时删除家目录

id 查看用户相关ID信息

语法:id [OPTION]... [USER]

用法

1-u     显示UID
2-g     显示GID
3-G     显示用户所属组的ID
4-n     显示名称,需配合ugG使用

切换用户 su

1su user    切换至user用户,但是不切换至user目录、不读取user用户配置文件
2su - user  切换至user用户,同时切换至user目录并读取user用户配置文件
3su/ su -   不写用户名默认切换至root用户
4exit       退出切换的用户,注意不要在切换的用户下再切换用户,会导致系统异常
5su - user -c 'command'   只使用user身份执行一次command命令即切换回原用户
6
7root用户切换至普通用户不需要密码,普通用户切换至root用户需要root密码

设置密码 passwd

语法:passwd [OPTIONS] UserName

用法:

实验:将harry的密码改为"hello",同时密码最短使用期限3天,最长使用期限42天,密码到期前7天提示修改,过期后5天将账户锁定

1echo "hello" | passwd -n 3 -x 42 -w 7 -i 5 --stdin harry

修改用户密码策略 chage

语法:chage [OPTION]... LOGIN

用法:

其他用户管理命令

  • chsh -s shell 修改shell
  • chfn 修改用户注释信息
  • finger 查看用户详细信息

组管理命令

创建组 groupadd

语法:groupadd [OPTION]... group_name

用法:

1-g GID     指明GID号;[GID_MIN, GID_MAX]定义在/etc/login.defs
2-o         配合-g属性,不检查GID的唯一性
3-r         创建系统组

修改组属性 groupmod

语法:groupmod [OPTION]... group

用法:

1-n group_name     设置新名字
2-g GID            设置新的GID
3-o             配合-g属性,不检查GID的唯一性

删除组 groupdel

语法 groupdel group_name

更改组密码 gpasswd

语法:gpasswd [OPTION] GROUP

用法:

1-a user     将user添加至指定组中
2-d user     从指定组中移除用户user
3-A user1,user2,...     设置有管理权限的用户列表
4-d user     将user 从指定组中删除

实验:创建组david,将用户hellopeiyang,natasha,sarah加入到组中,将natasha从组中移除

1groupadd david
2gpasswd -a hellopeiyang,natasha,sarah david
3gpasswd -d natasha

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

更改和查看组成员 groupmems

语法:groupmems [options] [actions]

用法:

1#groups 显示用户所属于的组 `
2groups user_name`