用户、组、文件权限

时间:2022-01-07 05:21:08

linux系统登陆

登陆名是用户用来登陆系统的最长常8字符串,可以包含字母或数字,同时关联一个对应的密码

PAM

PAM即可插入式认证模块,其配置文件位于/etc/pam.d/*

/bin/login

系统启动后显示的登陆界面,是由/bin/login程序实现,/bin/login提供用户认证,其在编译时依赖于PAM

此程序默认到/etc/passwd和/etc/shadow文件中取匹配

login程序使用名称转换机制,调用nsswitch框架

备注:用户账号信息完全可用放到别的位置,比如nis数据库、LDAP数据和mysql数据库

nsswitch

nsswitch即网络服务转换/切换,是在login程序和passwd/shadow之间的一个中间层。实现处于不同用户认证数据库的账号信息耦合,

而不用再编译login程序。

nswitch是一个框架,它能配置到哪去找用户的账号密码信息(如:/etc/passwd,/etc/shadow),非常灵活、方便。

login程序借助nsswitch的功能,找到其框架定义的UID、密码和GID,完成用户认证

配置文件:/etc/nsswitch.conf,配置login程序基于哪个具体的库找对应存放用户账号密码的文件

库:libnss_file.so(passwd认证)、libnss_nis.so(nis)、libnss_ldap.so(ldap),用于实现不同的名称转换功能

用户管理

useradd、userdel、usermod、passwd、chsh、chfn、finger、id、chage

/etc/passwd文件

用于存储用户账号信息,普通用户只读

UID:用户ID

  UID0:管理员账号

  UID1~499:系统账号,为实现安全,为每个后台的服务单独创建一个系统账号,此账号不能登陆系统

  UID 500~65535:普通账号

GID:用户组ID

  GID0:管理员组

  GID1~499:系统组

  GID500~65535:普通组

/etc/passwd文件格式:每行用6个冒号,分割成7段

字段解释:

    1.用户名:

    2.用户密码:x是密码占位符,表示密码存储在其他文件中,即/etc/shadow(安全起见)

    3.用户UID:

    4.用户GID:

    5.备注:用户账号的描述

    6.用户HOME目录:

    7.用户的默认shell

/etc/shadow文件

 用于存放用户的密码信息,普通用户不可读

/etc/shadow文件格式:每行8个冒号,分割成9段

字段解释:

     1.用户名:

     2.加密后的密码:MD5方式加密

           只有2个!!,表示未设置密码

           密码前加2个!!,表示锁定密码(密码锁定后,不能登陆系统)

           密码前加1个!,表示锁定账号(账号锁定后,不能登陆系统)

     3.自1970-01-01到最近一次修改密码经过的天数

     4.密码最短使用期限:多少天后才能更改密码,以上一次修改密码的时间为基准

     5.密码最长使用期限:多少天后必须更改密码,以上一次修改密码的时间为基准

     6.密码过期前多少天提醒用户更改密码:

     7.密码过期后多少天禁用用户账户

     8.用户账号被禁用的日期:自1970-01-01经过多少天后,禁用用户账号。

     9.预留字段

 

加密方法

  1.对称加密:加密和解密使用同一个秘钥

  2.非对称加密:每个密码都成对出现,一个为公钥,一个为私钥。公钥隐含于私钥中,可以提取出来,并公开出去。

      公钥加密,私钥解密:用于加密

      私钥加密,公钥解密:用于签名

   备注:非对称加密比对称加密慢3个数量级,相当耗资源

 3.单向加密/散列加密:

     不可逆

     非定长输入,定出输出。

    MD5: 128位定长输出(麻省理工学院人工智能实验室研发)

    SHA1:160位定长输出(美国国家委员会召集出来的一种通用算法),即安全hash算法

   SHA256:

   SHA512:军用级别

详见数字证书原理,公钥私钥加密原理

 

 

添加新用户

1.查看创建用户时的系统默认值

#useradd -D

GROUP=100    #默认加入组100中

HOME=/home  #默认主目录

INACTIVE=-1  #默认用户的密码在过期后不会被禁用

EXPIRE=        #未设置用户禁用日期,即永不过期

SHELL=/bin/bash   #默认shell

SKEL=/etc/skel   #用户模板,创建用户时,会自动将/etc/skel中的文件,复制到用户加目录下

CREATE_MAIL_SPOOL=yes  #/var/mail下为用户创建一个收件箱,用于接收邮件。

备注:/etc/skel中包含的都是环境配置文件,.bashrc .bash_profile .bash_logout

2.修改创建用户时的系统默认值

#useradd -D [args]

 args:

        -d 更改用户HOME目录位置

        -f  更改用户的密码过期后多少天后禁用

        -e 更改用户到期的日期,YYYY-MM-DD格式

        -g  更改用户默认组

        -s  更好默认的shell

eg: #useradd -D -s /bin/csh   #修改用户默认shell为csh

备注:也可直接修改对应的配置文件/etc/default/useradd

3.创建用户

useradd 

    -d 指定HOME目录,默认认为/home/用户名

    -e、-f、-g、-s、-d,用法与上面相同

    -G 指定附加组

   -p 指定用户密码

   -u  设置账户UID,默认自动排序

   -M  不创建用户的HOME目录

   -n   创建一个和用户登陆名同名的新组(默认不加-g选项,系统会自动创建一个与登陆名同名的组,不用-n)

   -c   给用户添加备注信息

   -r   创建系统账户,无HOME目录,也不能登陆系统(sbin/nologin)

 备注:没有HOME目录的用户登陆系统,直接在/目录下,提示符 bash-4.1$

修改用户

1.usermod

      -l  修改用户登陆名, #usermod -l 新名 旧名

      -L 锁定用户

      -U  解锁用户

      -p  修改账户的密码

      -g 修改用户默认组  #usermod -g 组名 用户名

      -G 修改更改用户附加组   #usermode -G 组名 用户名

      -u  修改用户uid   #usermode -u uid 用户名

      -d  修改用户HOME目录

      -s 修改用户默认shell  

      -e 修改用户过期时间

      -f 修改密码过期后到禁用的时间

 备注:-G选项,默认会覆盖之前的附加组配置。如果增加附加组的话,需要-a -G选项

2.passwd和chpasswd

passwd 

    -e  强制用户下此登陆修改密码

     -l 锁定用户密码

     -u 解锁用户密码

     -d 删除用户密码

     -S 查看用户是否设置密码

     -n 指定密码最短使用期限

     -x  指定密码最长使用权限

     -w 密码告警期限:过期前多少天提醒更改密码

也可通过标准输入,修改密码:

#echo "01234567" |  passwd --stdin szb #设置用户密码为01234567

chpasswd  批量修改密码

编写密码对文件,格式: 用户名:密码

#cat users.txt  

test1:1q2w3e

test2:1q1q1q

#chpasswd < users.txt  #按配置文件设置用户的密码

3.chsh 修改用户登陆shell (此次登陆生效)

#chsh -s /bin/csh  [用户名]   #不加用户名参数,默认修改当前用户的shell(普通用户只能修改自己的shell)

4.修改用户备注信息

#chfn szb   

Changing finger information for szb.
Name []: crazy
Office []: hello
Office Phone []: 6852333
Home Phone []: 010-111222

#普通用户只能修改自己的备注信息

5.查看用户备注信息

#finger szb

6.管理用户账号的有效期

chage

     -d     修改上次修改密码的时间(自1970-01-01 至上次修改密码时期的天数),单位:天数

     -E     设置密码过期的日期,格式:YYYY-MM--DD,或自1970 01-01经过的天数。

     -I      设置密码过期到锁定用户的天数

     -m    设置密码最短使用期限

     -M     设置密码最长使用期限

    -W      密码过期前多久提示用户修改密码

7.删除用户

userdel 

       -r  #连同HOME目录和”mail/用户名“2个目录

8.查看用户账号的完整性

#pwck

组管理

groupadd、groupdel、groupmod、gpasswd、groups

 1.查看用户属性

id [option]  USERNAME

   -u 查看用户uid

   -g 查看用户主要组(默认组)ID

   -G 查看用户所有组ID,第一个是主要组,后面显示的都是附件组。

    -n 与其他选项结合使用,将UID、GID转换为用户、组的名称

#id szb  #不加选项,显示用户详细信息

uid=503(szb) gid=503(szb) groups=503(szb),504(g1),505(g2)  context=root:system_r:unconfined_t:SystemLow-SystemHigh

第一个组显示的是szb用户的主要组(标红),后面的都是附加组(标蓝)

#id -G szb

503 504 505

#id -Gn szb

szb g1 g2

2.查看用户所属组

groups USERNAME 

#group szb 

szb:   szb songzhibing ww    #显示格式:  用户:主要组 附加组...

3、创建组

groupadd  [option]   GROUPNAME  

       -g 指定gid

       -r  设置添加的组为系统组

4.修改组

groupmod [option] GROUPNAME

    -g 修改gid

    -n 修改组名,修改组名后,GID、组成员不变

5.删除组

groupdel GROUPNAME

6.修改组密码

gpasswd 

     -r   删除组密码

     -R  锁定组密码

     -d   组中删除用户

     -a   组中增加用户

 6.修改用户的主要组:临时生效

#newgrp GROUPNAME  [用户名]

文件权限

理解文件权限

1.umask

root用户的默认umask=0022,普通用户的默认umask=0002

第1位用于特殊权限,不用与权限计算。

查看umask值:

#umask

 

2.创建文件、目录的默认权限

创建文件、目录的默认权限=文件、目录的最大权限-umask后3位

备注:linux权限默认不继承

文件最大权限:666

目录最大权限:777

3.权限

r,w,x 

8进值      二进制         ls -l查看显示       备注      
0     000          ---                    无权限
1     001     --x                    执行
2     010     -w-                   写
3     011     -wx                   写、执行
4     100      r--                   读
5     101      r-x                  读、执行
6     110      rw-                 读、写
7     111      rwx                 读、写、执行

r:4

w:2

x:1

文件:

   r:可读,可用cat等命令查看文件内容、复制

   w:可写,可编辑或删除此文件

   x:可执行,当作命令提交给内核运行

目录:

    r:可读,可以用ls命令,列出目录内部所有文件

    w:可写,可在此目录创建文件

    x:可执行,可以cd切换进此目录,也可以用ls -l查看内部文件的详细信息。

更改文件权限

chmod 

1.更改所有用户权限

chmod 742 filename # 修改filename的权限:属主权限(读、写、执行)、属组权限(读)、其他用户权限(写)

2.根据用户类别设置权限

chmod [ugo]<+-=>  <rwxXstugo>

用户类别:可选,不写表示针对所有用户

  u:属主

  g:属组

  o:其他用户

  a:所有,等同于ugo

权限操作符:

    + :给用户类别增加权限

    -: 给用户类别减少权限

    =:给用户类别设置等于权限,等号出现时,必须指定用户类别选项(不能为空)

权限:

    r:读

   w:写

   x:执行 

   u:根据权限操作符不同,让用户类别增加、删除、等于属主的权限

   g:根据权限操作符不同,让用户类别增加、删除、等于属组的权限

   o:根据权限操作符不同,让用户类别增加、删除、等于其他用户的权限

   X:不懂

   s:特殊权限

   t:粘着位

 eg:

     #chmod +x filename   #给所有用户增加执行权限

     #chmod g=a filename   #设置属组权限等于属主的权限

     #chmod u-wx  #用户减少写、执行权限

改变所属关系

1.改变文件属主

chown 所属主 filename...

    -R 递归设置属主   

    --reference=somefile file1 file2  #将file1、file2的属主改成和somefile一致

eg: #chown -R hadoop /tmp/abc   #递归设置abc目录及其内部文件、目录的属主为hadoop

tips:

chown可以同时修改文件的属主、属组,也可以单独修改文件属组

#chown root:root /tmp/abc   #属主、属组一块改

#chown :root /tmp/abc  #只修改属组

2.改变文件属组

chgrp 所属组 filename...

    -R  递归修改

   --reference=somefile file1 file2  #将file1、file2的属组改成和somefile一致、

修改文件特殊属性 chattr

chattr [RV] [-v version] [mode] files...

    -R  递归修改

mode:+=[ASACDdIijsTtu]

    a:只能追加内容,不能删除

    i:不能追加、改名、删除

    s:(安全)属性:当文件被删除时,此文件所在磁盘的块将全部被0填充

    u:(不可删除)属性:文件删除后,此文件的内容还可以被恢复

    c:(压缩)属性:当此文件在写操作时,将自动被压缩。读的时候,自动解压

#chattr +a filename  #给filename增加a权限

   --reference=somefile file1 file2  #将file1、file2的属组改成和somefile一致、

查看文件特殊属性 lsattr

lsattr [-RVadv] [files...]     #不加文件参数,显示当前所有文件的特殊属性。

文件特殊权限

linux特殊权限:SUID、SGID、SBIT(粘着位)

SUID:针对文件,当文件被用户使用时,程序会以文件的属主的权限执行

SGID:针对文件和目录,对文件来说,程序会以文件的属组的权限执行,对于目录来说,目录中创建的新

文件会以目录的属组作为属组。

SBIT:进程结束后,文件还会在内存中

特殊权限设置:

chmod 4777 file  #第一位表示特殊权限

chmod u+s   file  #文件属主增加SUID权限

chmod g+s  file #文件属组增加GUID权限

chmod o+t  file #其他用户增加粘着位权限

特殊权限表示格式说明

二进制值     八进制值      权限描述

000                   0             无特殊权限

001                   1             粘着位

010                   2              SGID

011                   3              SGID和粘着位

100                   4              SUID

101                   5              SUID和粘着位

110                   6               SUID和SGIG

111                   7               SUID、SGID、粘着位

第1位表示SUID,第2位表示SGID,第3位表示粘着位

SUID

1.使用前提:

   只能对二进制程序有效

   执行者对于程序需要有执行权限

2.SUID权限效果:执行者以程序所有者权限运行

eg:普通用户执行passwd命令

# ls -ld /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd

文件属主为root,权限位rws:

s表示设置了SUID权限,且有执行权限(先有执行权限,然后再设置SUID权限)

S表示设置了SUID权限,无执行权限(先无执行权限,然后再设在SUID权限)

普通执行passwd命令分析:

1)执行passwd命令,底层操作的是/etc/shadow文件,查看/etc/shadow文件,虽然root用户显示为只读,但root

实际对所有文件、目录都有最高权限。

# ls -ld /etc/shadow
-r-------- 1 root root 1143 Sep 15 00:05 /etc/shadow

2)普通用户执行passwd命令时,由于/etc/bin/passwd文件有SUID权限,而普通用户对passwd有执行权限,所以会以文件属主的权限执行passwd命令,所以可以修改密码。以下是在普通用户执行passwd命令过程中,使用pstree命令跟踪到的,标红处表示,用户以root身份执行了passwd命令

#pstree -u

sshd-----sshd----bash
           |--sshd----sshd(szb)---bash----passwd(root)

SGID

SGID针对文件

1.使用前提:

   只针对二进制程序有效

   执行者对于程序需要有x权限

2.SGID权限效果:

   执行者以程序属组的权限运行

eg:locate命令

# ls -ld /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Sep 19 2008 /usr/bin/locate

文件所属组为slocate,权限为s:

s表示设置了SGID权限,且有执行权限(之前有x权限,再设置SGID权限)

S表示设置了SGID权限,且无执行权限(之前无x权限,再设置SGID权限)

普通用户执行locate命令过程:

1)执行locate实际会访问/var/lib/mlocate/mlocate.db这个文件,而普通用户无权限

#ls -ld /var/lib/mlocate/mlocate.db

-rw-r----- 1 root slocate 1643399 Sep 14 14:12 /var/lib/mlocate/mlocate.db

2)普通用户执行locate命令,会以/usr/bin/locate文件属组的身份(权限),运行locate命令。而locate属组slocate对

mlocate.db文件有读权限,所以普通用户可以访问此文件。

SGID针对目录

1.使用前提:用户对设置SGID权限的目录有rwx权限

2.SGID权限效果:在此目录下创建的新文件会以此目录的属组作为新文件的属组。

举例:创建共享目录/pub,使public组中的用户对此目录有rwx权限

# groupadd public
# usermod -a -G public szb
# usermod -a -G public songzhibing

#mkdir /pub

#chgrp public pub

#chmod 770 pub

#chmod g+s /pub    #添加SGID权限之前,public组中用户在从目录下创建的新文件,属组为用户本身。

#ls -ld /pub

-rwx-rws---- 1 szb public 0 Sep 17 13:20 szb.dir1

使用szb用户登陆,创建文件

$mkdir /pub/szb.dir1

$ls -ld  /pub/szb.dir1

-rwx-rws-r-- 1 szb public 0 Sep 17 13:20 szb.dir1

#发现szb.dir1的权限未继承父目录(linux权限默认不继承,而是根据umask来计算,SGID除外,见标红)

粘着位SBIT

1.使用前提:

  1)针对目录有效

  2)当所有用户对目录拥有wx权限,A在此目录创建文件A.dir,那么由于用户B登陆后,可以删除A创建的文件

SBIT权限效果:用户在设置SBIT权限的目录下,创建的文件只有自己和root用户可以删除。

举例:

#mkdir /dir

#chmod o=rwx /dir

#chmod o+t /dir

#ls -ld /dir

drwxr-xrwt 2 root root 4096 Jun 30 09:30 /dir

t表示设置了SBIT权限,且有执行权限(之前有x权限,再设置SBIT权限)

T表示设置了SBIT权限,且无执行权限(之前无x权限,再设置SBIT权限)

用户szb登陆,创建szb.dir文件

$mkdir /dir/szb.dir

其他用户登陆,无法删除szb.dir文件

备注:查看哪些文件设置了特殊权限  #find / -perm /7000 

文件系统访问列表 FACL 

作用:可以设置特定用户或特定组针对一个文件的操作权限

setfacl [option] 文件名

    -m:设定

           u:用户名:权限    #设置额外属主及权限

           g:组名:权限      #设置额外组组及权限

           d:u:用户名:权限  #为某个目录设置默认的额外属主及权限(子文件自动继承)

           d:g:组名:权限    #为某个目录设置默认的额外属组及权限(子文件自动继承)

  -R  递归设置,让子文件继承父目录的FACL权限(单次生效)

  -x   取消FACL权限

     u:用户名

     g:组名

 -b  #取消所有FACL设置,包括:默认FACL和FACL

getfacl 文件名    #查看FACL权限

举例:只让szb用户对root用户创建的/data有rwx权限

#mkdir data

#chnod 750 data

#ls -ld /data

drwxr-x--- 2 root root 4096 Sep 17 15:17 data

#mkdir data/root.data

#getfacl data

# file: data                 #文件名
# owner: root             #所有者为root
# group: root            #所有组为root
user::rw-                   #所有者权限
group::r--                 #所有组权限
other::---                  #其他用户权限

#setfacl  -R -m u:szb:rwx data   #递归添加额外属主szb,权限为rwx

#getfacl  data
# file: data                 #文件名
# owner: root             #所有者为root
# group: root            #所有组为root
user::rwx                   #所有者权限

user:szb:rwx             #额外属主szb,权限rwx

group::r-x                 #所有组权限
other::---                  #其他用户权限

[root@localhost ~]# getfacl /data/root.data/
# file: data/root.data/
# owner: root
# group: root
user::rwx
user:szb:rwx         #子文件也继承了父文件的FACL权限
group::r-x
mask::rwx
other::r-x

但是,root用户再创建一个文件,将不会自动继承父目录的FACL权限,解决方法:

     1.再次递归设置,下下策。setfacl  -R -m u:szb:rwx data  

     2.上上策,设置data的默认FACL权限

删除文件data的FACL额外属主szb的权限

#setfacl -x u:szb /data

默认FACL:对某个目录设置默认FACL权限,那么创建的子目录会自动继承这个目录的FACL权限。

承接上例:

#setfacl -d -m u:szb:rwx /data

[root@localhost ~]# getfacl /data/
getfacl: Removing leading '/' from absolute path names
# file: data/
# owner: root
# group: root
user::rwx
user:szb:rwx
group::r-x
mask::rwx
other::---
default:user::rwx
default:user:szb:rwx
default:group::r--
default:mask::rwx
default:other::---

备注:

#ls -ld /data

drwxr-x---+ 5 root root 4096 Jun 30 21:11 /data    #加号表示设置了FACL权限

取消/data的额外属主szb的默认FACL权限

#setfacl -d -x u:szb /data