linux 权限相关知识

linux day 6    

用户、组和权限

1.Linux用户:Username/UID

        管理员:root, 0

        普通用户:1-65535

            系统用户:1-499, 1-999

                对守护进程获取资源进行权限分配;

            登录用户:500+, 1000+

                交互式登录;

2.Linux组:Groupname/GID

        管理员组:root, 0

        普通组:

            系统组:1-499, 1-999

            普通组:500+, 1000+

3.Linux用户和组之间的关系:

    对于用户而言:

        用户必须有且只有一个主要组(primary group),也叫私有组,组名和用户名相同

        辅助组(secondary group),一个用户可以有0个或多个辅助组

    一个组可以有多个成员,也可以有多个组管理员,组管理员可以改变组密码,添加或删除

    组成员

4.跟用户相关的配置文件

    /etc/passwd     用户及其属性细心

    /etc/group      组及其属性信息

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

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

    注意:1):这两个文件一个是存储用户信息,一个是存储密码的,早期是放在一起的,可想而知这种做法并不安全,但使用命令也可以将这两个文件合并:

          #pwunconv 

          将密码填入/etc/passwd的x位置,并重命名/etc/shadow文件为/etc/shadow-,相关的密码策略不会显示在/etc/paaawd中

          #pwconv 

          恢复成两个文件

  

         2):查看/etc/passwd和/etc/shadow中某个特定用户的信息:

          #getent passwd 用户名

          #getent shadow 用户名

    /etc/passwd 用于存储用户的相关信息,此文件以:为分隔符分为7个字段,各个字段的含义如下:

        1) login name:登录用户名

        2) passwd:密码(x,表示占位符;其内容在/etc/shadow文件中)

        3) UID:用户ID 

        4) GID:基本组ID

        5) Comment:用户全名或注释

        6) home directory:用户家目录

        7) shell:用户的默认shell

    

    /etc/shadow 用于存储用户的密码信息,同样以:为分隔符分为9个字段,各个字段的含义如下:

        1) 用户名

        2) 加密后的用户密码;现在一般使用sha512加密

        3) 上次修改时间:从1970年1月1日起到最近一次被更改的时间

        4) 最小使用时间:密码过几天后可以变更(0表示可随时变更)

        5) 最大使用时间:密码过期时间(99999表示永不过期)

        6) 密码警告时间:密码过期前几天系统提示用户(默认为一周)

        7) 密码失效时间:密码过期后多少天账号会被锁定

        8) 账号过期时间:从1970年1月1日起,多少天后账号失效

        9) 保留字段(reserved field)

    密码加密

    md5 128bits

    sha1  160bits

    sha224  224bits

    sha256  256bits

    sha384  384bits

    sha512  512bits

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

    或者改  cat /etc/login.defs 

5.组相关的两个配置文件

    /etc/group和/etc/gshadow

      查看/etc/group和/etc/gshadow中某个特定用户的信息:

          #getent group 用户名

          #getent gshadow 用户名

    /etc/group存储的是组的相关信息,以:为分隔符:

        1) 组名

        2) 组密码;通常不需要设定;密码被记录在/etc/gshadow

        3) GID:组ID

        4) 以当前组为附加组(辅助组)的用户列表(以逗号分隔)

    /etc/gshadow 存储的是组密码的相关信息

        1) 组名

        2) 组密码;和/etc/shadow的密码构造一样

        3) 组管理员;逗号分隔用户列表,这些用户都是组管理员

        4) 组成员;逗号分隔用户列表,这些都是组成员

6.专门来修改/etc/passwd和/etc/group的工具:

    修改且带有语法检查的:vipw和vigr

    只有语法检查功能:pwck和grpck

7.用户管理命令

    

    1) 创建用户

  

        useradd [option] username

            -u UID  UID的范围在/etc/login.defs中定义

            -u -o   不检查UID的唯一性

            -g GID  指明要加入的基本组,如果不指定则创建一个与用户名相同的组,并将其作为用户的基本组

            -c "Comment" 用户的注释信息

            -d HOME_DIR 以指定的路径为家目录 此处指定的路径必须不能是已存在的目录

            -s SHELL 指明用户的默认shell

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

            -N 不创建私有组作为,使用users组(Gid=100)作为基本组

            -r 创建系统用户

            -M 不创建家目录

            -D 显示默认配置

            -D -s 修改用户的默认shell信息

    

    2)创建用户口令            

        passwd [options] username

            -l 锁定指定用户 (密码前加!!) 

            -u 解锁指定用户 (删除密码前的!!)

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

            -x maxdays: 最大使用期限

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

            -i inactive-days: 非活动期限

            –stdin 从标准输入接收用户密码; eg: echo "123456" | passwd –stdin username

    3)批量创建用户和修改用户口令 

        #newusers files 批量创建用户;file是满足/etc/passwd格式的文件

        #chpasswd 从标准输出读入user:passwd的格式的多行文本,以此来批量修改用户口令

                    vim batchpasswd

                    user1:明文口令

                    user2:明文口令

                    …

                    cat batchpasswd | chpasswd

    

    4)用户属性修改

        #usermod [option] username 

            -u UID:指定用户新的UID

            -g GID:指明用户新的基本组

            -G GP1[Gp2…] 指明新的附加组,原来的附加组会被覆盖(若要保留原来的附加组,则要使用-aG)

                -G ""  清空附加组

            -s SHELL:指明新的默认shell

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

            -d HOME: 新的家目录,原来的家目录中的文件不会同时移动至新的家目录中,若要移动,则要同时使用-m选项

            -l login_name: 新用户名

            -L: 锁定用户 (在/etc/shadow密码前加!)

            -U: 解锁用户

            -e yyyy-MM-DD:指明用户账号的过期日期

            -f INACTIVE:设定非活动期限

            -r:删除用户家目录

    5)查看用户的相关信息

        #id [options] [user]  查看用户相关信息;不指明用户则查看的是当前用户

            -u:UID

            -g:GID

            -G:group 附加组

            -n:显示id对应的名字,通常和-u和-g一起使用

                 id -un [user] 或 is -gn [user]

        #finger 打印登录到系统的所有用户的信息

            finger user  查看user相关的一些信息,比如家目录,shell类型,邮件等

    6) 在/etc/passwd中家目录字段必须不能为空

     如果为空,则登录这个用户时,键入用户和密码之后,会不出现提示符,不能输入任何命令,等待超时之后(提示:/usr/bin/xauth:  timeout in locking authority file /.Xauthority),进入/

               若su – user完全切换或不完全切换 su user, 则会显示su: user user does not exist

     

     如果不空,但目录不存在,则登录这个用户时,会直接进入/,

                             若su – user完全切换 会直接进入/

                             若不完全切换 su user 会进入执行 su user的目录

  

  7) 切换用户或以其它用户身份执行命令

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

      切换用户的方式:

      su user:非登录式切换,不会读取目标用户的配置文件,不改变当前工作目录,也称之为不完全切换

      su – user 登录式切换,会读取目标用户的配置文件,切换至其家目录,也称之为完全切换

      Attention:root执行su至其他用户无需密码,非root用户切换时需要密码

      

      切换身份执行命令

      su [-] user -c 'cmd'

      选项 -l –login

      su -l user 相当于 su – user

  

  8)修改用户相关信息的其他命令

    chfn 指定个人信息

    chsh 指定shell

  

  9)修改用户密码策略

    chage [option]  user

          -d last_day 修改最后修改时间 对应于/etc/shadow的第3个字段

          -m –mindays Min_days 修改最小使用时间 对应于/etc/shadow的第4个字段 过多少时间可以修改

          -M –maxdays Max_days 修改最大使用时间 对应于/etc/shadow的第5个字段

          -W –warndays Warn_days 修改警告时间 对应于/etc/shadow的第6个字段

          -I –inactive Inactive 修改账户失效时间 对应于/etc/shadow的第7个字段                  

          -E –expiredate Expire_Date 修改账户过期时间 对应于/etc/shadow的第8个字段 

          -l 显示密码策略

    下次登录强制重设密码

    chage -d 0 tom 等价于 passwd -e tom

    e.g. chage -m 0 -M 42 -W 14   -I 7 tom

         chage -E 2016-09-10 tom 

  

  10)删除用户

      userdel user 不会删除用户家目录

              -r user 才会删除用户的同时删除家目录

     在/etc/login.defs中,有这样的描述

     # This enables userdel to remove user groups if no members exist.

     #

     USERGROUPS_ENAB yes    

8. 组管理命令

  1)创建组

     groupadd [option] groupname

              -g gid 指明GID 范围在/etc/login.defs中指定

              -r 创建系统组

     

  2)修改组

    groupmod [OPTION] group

             -n groupname :组的新名字

             -g GID :新的GID

  

  3)组删除

     groupdel group 

  

  4)更改组密码

    gpasswd [option] group

            -a user 将user加入到指定组中

            -M user1,user2…指定组成员列表

            -d user 从指定组中删除user

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

    

    newgrp命令:临时切换基本组

        如果用户不属于此组,则需要组密码

        Attention:具体参见本文档/etc/gshadow部分

   

   5)更改组成员

    groupmems [options] [action]

    options:

        -g /–group groupname 更改为指定组(只有root可用)

    

    action:

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

        -d / –delete username 指定从组删除的用户

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

        -l / –list         显示组中成员

    

    e.g. groupmems -g peng -a wang 将wang用户加入peng组

         groupmems -g peng -l 查看peng组中的所有成员,似乎是查看以peng组为附加组的成员列表

         groupmems -g peng -p 清除所有peng组中的成员

    

    6)查看组成员

       groups user1 user2 .. usern 列出指定一个或多个用户的组关系,格式:primary group:secondary group1 secondary group

       groups 如果没有指定用户,那么打印当前进程的组关系,通常是没有基本组和附加组的概念    

以上是基础内容:

我是分割线————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

一次创建多个用户的用法

[root@Centos7 ~]# cat useradd.txt 

user1:x:2001:2001::/testdir/user1:/bin/bash

user2:x:2002:2002::/testdir/user2:/bin/bash

user3:x:2003:2003::/testdir/user3:/bin/bash

[root@Centos7 ~]# newusers useradd.txt 

[root@Centos7 ~]# cat passwd.txt

user1:redhat

user2:ooppqq

user3:xxyyzz

[root@Centos7 ~]# cat passwd.txt | chpasswd 

创建用户的家目录内的隐藏文件

[root@Centos7 ~]# cp -r /etc/skel/. /testdir/user1

[root@Centos7 ~]# cp -r /etc/skel/. /testdir/user2

[root@Centos7 ~]# cp -r /etc/skel/. /testdir/user3

echo 112233 | passwd –stdin user2 修改用户密码的命令

简单的用户管理文件 回忆

/etc/passwd

user1:x:2001:2001::/testdir/user1:/bin/bash

username:x:uid:gid:comment:home:shell

/etc/shadow

user1:$6$…..t1:17015:0:99999:7:::

username:password:password age:min:max:warn:inactive:usernameage:

/etc/group

newgroup:x:3000:user1,user2,user3

groupname:x:gid:groupmember

/etc/gshadow

newgroup:$6$…XI.:user1:user1,user2,user3

groupname:password:groupadmin:groupmember

权限

    对目录的意义

        read:查看目录内容,列表

        excute:cd 读目录内文件内容

        write:能删和创建文件 配合x

    对文件的意义

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

        w:可修改其内容

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

        X:加 x 到目录上,而不给文件 x 权限(必须目录内的文件没有x)

  chmod who opt per file…

        who:u,g,o,a

        opt:+,-,=

        per:r,w,x,X

  chmod 数字 file

        数字:3个8进制

        r w x

        4 2 1 = 7

        rw-r—–

        420400000

        6  0  0

  chown 只能root能执行

  chgrp root 或者 文件所有者user可将之改为user的所属组

  修改文件的属主 和 属组

      chown

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

      chown [OPTION]… –reference=RFILE FILE…    file 的主与rfile相同

            -R 递归

      chown user1:group1 file

      同时修改 file 的 属主 属组

      chown :group file

      chown user1: file 则 主 与 组 都修改为 user1

      以上两条命令 简单修改用户属性技巧

      chgrp group1 filp

            -R

            –reference=RFILE FILE  FILE 与 RFILE相同用户组

此处再次重复以上回忆

    文件权限

      文件:

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

            w:可修改其内容

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

      目录:

            r:可ls查看目录中的文件列表

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

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

            X:只给目录x权限,不给文件x权限(目录内文件必须没有x权限)

新建文件和目录的默认权限

    

    默认权限 = 最大权限 – umask

      目录

      文件:发现结果有奇数权限+1, 偶数权限不变

    umask值 

      新建file权限:666 – umask

          如果所得结果某位存在执行(奇数)权限,则将其权限+1

      新建dir 权限:777 – umask

      非特权用户umask是 002

      

      root的 umask 是  022

      umask命令:

        umask #    :直接设定值 如umask 002

        

        umask -S 模式方式显示

        umask -p 输出可被调用

        全局设置: /etc/bashrc 用户设置:~/.bashrc

linux 文件系统上的特殊权限

  SUID  SGID  Stiky

  前提:进程有属主和属组;文件有属主和属组

    1,任何一个可执行程序文件能能启动为进程:取决于发起者对程序文件是否拥有执行权限

    2,启动为进程之后,其进程的属主卫发起者;进程的属组为发起者所属的组

    3,进程访问文件时的权限,取决于进程的发起者

      a 进程的发起者,同文件的属主:则应用文件属主权限

      b 进程的发起者,属于文件属主;则应用文件属组权限

      c 应用文件“其他”权限

  可执行文件上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…  

  SUID SGID STICKY

   4     2     1

   chmod 7777 xxx

   chmod 4777 xxx 

权限位映射

  SUID  :user,占据属主的执行权限位

        s:属主拥有x权限

        S:属主没有x权限

  SGID  :group,占据属组的执行权限位

        s:group拥有x权限

        s:group没有x权限

  Sticky:other,占据other的执行权限位

        t:other拥有x权限

        T:other没有x权限 

总结

    SUID 只能作用在2进制的程序上

    Sticky 只能作用在目录上

    sgid 作用在二进制的程序上:用户运行该程序是,自动继承该 程序所属组的权限

    chmod g+s file

    sgid 作用在目录上时,该目录内新建的文件或目录的所属组自动继承该目录的所属组

    chgrp groupname dir; chmod g+s dir

设定文件特殊属性

  chattr +i file…   给文件设特殊属性  即使root 也不能删除、改名、更改内容

  chattr -i file…

  chattr +a file…   给文件设特殊属性  即使root…  

  只能追加内容 不能删除、改名、更改内容

  lsattr file 显示文件的特殊属性

访问控制列表

  ACL

      除了文件的所有者,所属组合其他人,可以对更多的用户设置权限

    getfacl file/directory  查看文件或目录的访问控制列表

    setfacl -m u:user:rwx file

    setfacl -m g:user:000 dir 

    给 特殊user 文件或目录 添加访问特殊权限

    setfacl -M file.txt file/dir

    创建指定文件 

        文件内容

        u:user1:0

        g:group1:rwx

        u:user2:rw

    setfacl -Rm g:group1:rw file/dir

    setfacl -m d:u:user1:rx dir

              d  默认 该目录下后创建的都赋予user1特殊权限

    setfacl -x u:user1 file/dir

    删除 user1 的特殊访问权限

    setfacl -X file.txt dir

        创建文件 file.txt  并删除文件内的用户或组的特殊访问权限

     ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限

     getfacl可看到特殊权限:flags

     默认ACL权限给了x,文件也不会继承x权限。

     base ACL 不能删除

     setfacl-k dir 删除默认ACL权限

     setfacl-b file1清除所有ACL权限

     getfaclfile1 | setfacl–set-file=-file2 复制file1的acl权限给file2

访问控制列表

maskmask只影响除所有者和other的之外的人和组的最大权限

[root@Centos7 testdir]# setfacl -m u:user1:rw xxx

[root@Centos7 testdir]# setfacl -m u:user2:r xxx

[root@Centos7 testdir]# setfacl -m u:user3:rwx xxx

[root@Centos7 testdir]# getfacl xxx

# file: xxx

# owner: root

# group: root

user::rw-

user:user1:rw-

user:user2:r–

user:user3:rwx

group::r–

mask::rwx

other::r–

这三个用户我想都只有rw 权限 可直接用mask来改 

[root@Centos7 testdir]# setfacl -m mask::rw xxx

[root@Centos7 testdir]# getfacl xxx

# file: xxx

# owner: root

# group: root

user::rw-

user:user1:rw-

user:user2:r–

user:user3:rwx      #effective:rw-

group::r–

mask::rw-

other::r–

练习

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

原创文章,作者:Nicolas ZhaoIV,如若转载,请注明出处:http://www.178linux.com/30455