早期Linux系统设计为了能够实现多用户、多进程高效的利用服务器资源,在此种情况下,为了能够保证用户与用户之间的文件不被随意的访问及修改、删除等操作,用户、组的管理能在某种程序上实现管理用户或批量管理用户。由于Linux的设计哲学思想『一切皆文件』,用户对设备的访问就是对文件的访问。
一、用户与组
Linux下有三类用户
1.超级用户: root 具有操作系统的一切权限 UID 值为0
2.普通用户:
普通用户具有操作系统有限的权限, UID值 500+
3.伪用户:
是为了方便系统管理, 满足相应的系统进程文件属主的要求, 伪用户不能登录系统,CentOS6 UID值 1 — 499,CentOS7 UID值为1 — 999.
二、安全上下文
当一个用户发起一个进程时,此进程将继承用户的属主、属组的权限,再以进程继承的权限来控制文件的访问权限。
例如:
[root@localhost~]# /bin/cat FILE ##取决于root用户对FILE文件拥有的权限 [young@localhost~]$ /bin/cat FILE ##取决于young用户对于FILE文件的拥有权限
三、组的类别
用户的主要组(主组): 用户必须属于一个且只有一个主组 组名同用户名,且仅包含一个用户:私有组
用户的附加组(辅助组): 一个用户可以属于零个或多个辅助组
四、用户和组的配置文件
1.Linux用户和组的主要配置文件
/etc/passwd:用户及其属性信息(名称、 UID、主组ID等),可使用vipw命令编辑,使用pwck命令校验格式,无效用户等
/etc/group:组及其属性信息,可使用vigr命令编辑,可使用grpck校验格式,无效组等
/etc/shadow:用户密码及其相关属性,可使用pwck命令校验格式无效用户等
/etc/gshadow:组密码及其相关属性,可使用grpck校验合适,无效组等
2.配置文件格式说明
/etc/passwd
root:x:0:0:root:/root:/bin/bash 用户名:密码:UID:GID:用户注释信息:用户家目录:Shell定义
用户名: 用户的名称 密码: X表示占位符,也可以是密码 UID: 用户识别代码 GID: 用户所属组的GID(基本组) 用户注释信息:Comment,可以完善用户的基本信息 用户家目录: 系统登录用户后的工作目录 shell: 定义用户登录系统所使用的shell,指定的shell需要在/etc/shells中出现
/etc/shadow
root:$6$YqkEsOcfKPptyhnS$YD0ym4BZ52pzcCnU….:16781:0:99999:7::: 用户名:密码:上一次修改密码的时间:密码最小使用期限:最长使用期限:警告时间:帐户过期时间:保留字段
用户名: 用户的名称,对应/etc/passwd文件中 密码: Centos6中使用MD5加密算法,Centos7中使用sha1的算法,第一个$后面加密算法类型,第二个$后面表示salt,第三个$后面表示密码的提取码(参照加密类型) 上一次修改密码的时间: 指用户上次修改密码的时间,计算方法:从Linux元年1970年01月01日0点0分到目录所经过的秒数 密码最小使用期限: 指用户修改密码后,需要到多少天后方可更改密码,0表示禁用 密码最长使用期限: 指用户的密码到多少天后需要修改密码 警告时间: 指用户密码到期前多少天提示用户修改密码,0和空字段表示禁用此功能 帐户过期时间: 批帐户在密码过期后多少天还未修改密码,将被停用
/etc/group
root:x:0: 组名:密码:GID:User_list
组名:组的名称,默认同名用户名 密码: 组的密码占位符,用于用户临时切换至需要的组以获取相应权限,可以使用newgrp GROUP_NAME切换 GID:组的全局识别号 User_list:隶属此组的用户,多个用户使用","隔开
/etc/gshadow
root:$6$PLRAi/Z/svr$PRelPtvLuGJqvFG3D8fbjYHDho2RQUe93glO.:: 组名:密码:组管理者:User_list
组名:组的名称,同步/etc/group文件中 密码:第一个$后面表示加密算法,第二个$后面表示加密的密码 组管理者:可以对此组成员有操作权限,如果有多个,可以用逗号隔开 User_list: 用户的列表,如果有多个,可以使用逗号隔开
五、用户和组管理命令
1.用户管理命令
a、useradd
useradd - create a new user or update default new user information synopsis: useradd [options] LOGIN useradd -D [options] options: -u : 指定用户的UID -g : 指明用户所属基本组,可为组名,也可以GID,组或者GID必须存在 -c : 指定注释信息,如果有空格,需要使用" "包含 -d : 指定用户家目录,创建用户时,会自动将/etc/skel中的文件复制到用户家目录下,如果指定的文件存在将不会复制文件,如果父目录不存在,创建也将会失败 -s : 指定用户shell -r : 指定创建一个系统用户 -M :不创建用户家目录 -G : 指定附加组,多个使用逗号隔开 -D :修改创建用户的配置信息,文件位于/etc/default/useradd 注:创建用户时的诸多默认设定配置文件为/etc/login.defs
实例一:
[root@localhost ~]# useradd -u 1003 -c "TestUser" -d /home/geek -s /bin/sh geek [root@localhost ~]# getent passwd geek geek:x:1003:1003:TestUser:/home/geek:/bin/sh
实例二:
[root@localhost ~]# useradd sys -r -M -g 1001 -G root [root@localhost ~]# getent passwd sys sys:x:498:1001::/home/sys:/bin/bash [root@localhost ~]# id sys uid=498(sys) gid=1001(young) groups=1001(young),0(root)
注:useradd命令加参数-D参看系统的默认值:
# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
解释: 1)新用户添加到GID为100的公共组 2)新用户的HOME目录将会位于/homoe/username 3)新用户账户密码在过期后不会被禁用 4)新用户账户未被设置为某个日期后就过期 5)新用户账户将bash shell作为默认shell 6)系统会将/etc/skel目录下的内容复制到用户的HOME目录下 7)系统为该用户账户在mail目录下创建一个用于接收邮件的文件 修改: useradd –D -s SHELL useradd –D –b BASE_DIR useradd –D –g GROUP
如 #useradd -D -s /bin/tsch
,修改默认的shell为/bin/tsch。
倒数第2个值很有意思。useradd命令允许管理员创建一个默认的HOME目录配置,然后把它作为创建新用户HOME目录的模板。这样,就能自动在每个新用户的HOME目录里放置默认的系统文件。在Ubuntu Linux系统上,/etc/skel目录下有下列文件:
[root@localhost ~]# ls -A /etc/skel .bash_logout .bash_profile .bashrc
此上文件不复制进去用户命令提示符等会缺失。
/etc/login.defs文件也是新建用户属性的配置文件。
b、newusers与chpasswd
newusers命令用来批量创建用户
chpasswd用来批量修改密码
批量创建用户并修改密码
A、创建用户列表user.txt(文件格式与/etc/passwd相同)
[root@localhost ~]# vim users.txt user1:x:600:600::/home/user1:/bin/bash user2:x:601:601::/home/user2:/bin/bash user3:x:602:602::/home/user3:/bin/bash
B、批量创建用户
[root@localhost ~]# newusers users.txt [root@localhost ~]# tail -3 /etc/passwd user1:x:600:600::/home/user1:/bin/bash user2:x:601:601::/home/user2:/bin/bash user3:x:602:602::/home/user3:/bin/bash
C、复制/etc/skel下文件到用户家目录
[root@localhost ~]# cp /etc/skel/.[^.]* /home/user1 [root@localhost ~]# cp /etc/skel/.[^.]* /home/user2 [root@localhost ~]# cp /etc/skel/.[^.]* /home/user3
D、创建密码文件passwd.txt(格式===> 用户名:密码)
[root@localhost ~]# vim passwd.txt user1:young user2:young user3:young
E、批量修改密码
[root@localhost ~]# cat passwd.txt | chpasswd
查看:
[root@localhost ~]# tail -3 /etc/shadow user1:$6$9w3Hm/gYw$fVQMOyaJxzR9yBSbmPlZY8DKHb2BLGPAVxmFqJsN4rTGYao5B4TRZW/i7z1UgWF/mNI6jJ45bbD4vZtJhIYu50:17166:0:99999:7::: user2:$6$9pXcj/.LREq/OK$M8tY6gpxKliOgnKG/N7H0oiuD88RAbB7BM/94UlDWlefXsTqyYReYk96FK6mofd2quYHXA7mID3q5nBgqYHjL0:17166:0:99999:7::: user3:$6$lxmzw4KcEA/hfm6$nrc9rLSwM4JXfLOm7p2a1CqWB8Y5fgioU3DctpvfIw1.A6iqDy0aADGkReT1FVJhOubRC3l2iUUq8PwnJx9HK0:17166:0:99999:7:::
测试:
[root@localhost ~]# su - user1 [user1@localhost ~]$ su - user2 Password: [user2@localhost ~]$
c、usermod
usermod命令可实现用户属性修改。
usermod - modify a user account synopsis: usermod [options] LOGIN options: -u : 修改用户UID -g : 修改用户GID -c : 修改用户的注释信息 -d : 修改用户家目录,需要配合使用-m选项才会自动复制用户家目录下的文件到新的家目录 -m : move-home to new directory -s : 修改用户的shell -l : 修改用户的登陆名,即login名称 -G : 修改用户的附加组信息,需要配合-a(append)一起使用,如果不使用-a将删除原来的附加组 -a : --append,连接多个附加组的参数 -L : 锁定用户,即lock,在/etcpasswd文件中,密码前面加!(一个) -U : 解锁用户,即unlock,在/etc/passwd文件中,取消密码前面的!号
实例:
[root@localhost ~]# getent passwd user1 user1:x:600:600::/home/user1:/bin/bash [root@localhost ~]# id user1 uid=600(user1) gid=600(user1) groups=600(user1) [root@localhost ~]# usermod -u 700 -g user2 -aG bin,root -c 'linux' -d /none/user1 -s /bin/tsh -l linux user1 [root@localhost ~]# getent passwd linux linux:x:700:601:linux:/none/user1:/bin/tsh [root@localhost ~]# id linux uid=700(linux) gid=601(user2) groups=601(user2),0(root),1(bin)
d、userdel
userdel命令用来删除已经存在的用户。
userdel - delete a user account and related files synopsis: userdel [options] LOGIN options: -r : 删除用户的同时删除用户的家目录,即--remove参数
实例:
[root@localhost ~]# userdel -r user3
e、id
id命令查看用户相关信息。
id [OPTION]... [USER] -u: UID -g: GID -G: Groups -n: Name (与-u连用可现实名称)
实例:
[root@localhost ~]# id geek uid=1003(geek) gid=1003(geek) groups=1003(geek) [root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root) [root@localhost ~]# id -G 0 [root@localhost ~]# id -un root
f、su
su命令用来切换当前用户身份。
su[options…] [-] [user [args…]] 切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
su – UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
su -l UserName相当于su – UserName
root su至其他用户无须密码;非root用户切换时需要密码
su [-] UserName -c ‘COMMAND’ :撤换至指定用户身份执行命令,命令执行结束后即退出
-c : 不用登陆用户即可以以指定用户执行命令 su – geek -c ‘id -u’
[root@localhost ~]# su - geek -c 'id' uid=1003(geek) gid=1003(geek) groups=1003(geek)
g、passwd
passwd命令用来进行用户密码管理。
passwd - passwd - update user's authentication tokens synopsis:passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] 1、passwd (修改自己的密码) 2、passwd USERNAME(修改其他用户的密码,root权限 ) options: -l : 锁定用户,在/etc/passwd的密码前面加!!, -u : 解锁用户,在/etcpasswd的密码前!!取消 -d : --delete,删除用户密码 -e DATE : --expire,设定过期时间 -i DAYS : 非活动时间 -n days : 最短使用期限 -x days : 最长使用期限 -w days : 警告期限 --stdin : echo "PASSWD" | passwd --stdin root
实例:
[root@localhost ~]# echo young | passwd --stdin geek Changing password for user geek. passwd: all authentication tokens updated successfully.
h、chage
chage命令用来修改用户密码策略。
chage [OPTION]… LOGIN -d:修改用户最近一次修改密码的日期 -E:修改账户的过期日期 -I:密码禁用期 -m:密码的最小使用期限 -M:密码的最大使用期限 -W:密码的警告时间 –l:显示密码策略
A、查看mysql用户以及密码的有效期
[root@DB-Server ~]# chage -l mysql Last password change : Mar 26, 2015 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : -1 Maximum number of days between password change : -1 Number of days of warning before password expires : -1 [root@DB-Server ~]#
B、设置mysql用户60天后密码过期,至少7天后才能修改密码,密码过期前7天开始收到告警信息。
[root@DB-Server ~]# chage -M 60 -m 7 -W 7 mysql You have new mail in /var/spool/mail/root [root@DB-Server ~]# chage -l mysql Last password change : Mar 26, 2015 Password expires : May 25, 2015 Password inactive : never Account expires : never Minimum number of days between password change : 7 Maximum number of days between password change : 60 Number of days of warning before password expires : 7 [root@DB-Server ~]# clip_image001
C、强制新建用户第一次登陆时修改密码
[root@DB-Server home]# useradd test [root@DB-Server home]# passwd test Changing password for user test. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@DB-Server home]# chage -d 0 test You have new mail in /var/spool/mail/root [root@DB-Server home]# chage -l test Last password change : password must be changed Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
i、chsh
chsh命令用来更改当前用户的shell类型。
使用权限:所有使用者 命令:chsh 用法:shell>> chsh 说明:更改使用者 shell 设定 范例:
shell>> chsh Changing fihanging shell for user1 Password: [del] New shell [/bin/tcsh]: ### [是目前使用的 shell] [del] shell>> chsh -l ### 展示 /etc/shells 档案内容 /bin/bash /bin/sh /bin/ash /bin/bsh /bin/tcsh /bin/csh
1 我想知道我机器安装了哪些shell? 两种方法可以查看: 第一种: [rocrocket@jb51.net ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二种: [rocrocket@jb51.net ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/zsh 其实chsh -l也是来查看这个文件。
2 我想知道我当前正在使用的shell是哪个阿?
[rocrocket@jb51.net ~]$ echo $SHELL /bin/bash
注意SHELL一定要是大写。可以看到,我目前使用的shell是/bin/bash
3 执行了zsh之后,我查看当前shell类型仍然是/bin/bash呢? 请注意,我们虽然执行了zsh,但是所谓“当前的shell”是一个大环境的概念,是针对一个已登录的用户而言的。而我们执行zsh只是启动了一个zsh的解释器程序而已,并没有改变大环境。如果想改变“当前的shell”,那么还是要使用chsh才可以。
4 我想把我的shell改成zsh!
[rocrocket@jb51.net ~]$ chsh -s /bin/zsh Changing shell for rocrocket. Password: Shell changed. [rocrocket@jb51.net ~]$
使用chsh加选项-s就可以修改登录的shell了! 你会发现你现在执行echo $SHELL后仍然输出为/bin/bash,这是因为你需要重启你的shell才完全投入到zsh怀抱中去。
5 chsh -s到底是修改了哪里? 秘密告诉你吧。chsh -s其实修改的就是/etc/passwd文件里和你的用户名 相对应的那一行。现在我来查看下:
[rocrocket@jb51.net ~]$ cat /etc/passwd|grep ^rocrocket rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh
看!你可以发现输出内容的最后部分已经变成了/bin/zsh了!下次你重启的时候,linux就会读取这一命令来启动你的shell了! 好了,我要恢复正常工作,把shell修改会我熟悉的/bin/bash了!
[rocrocket@jb51.net ~]$ chsh -s /bin/bash Changing shell for rocrocket. Password: Shell changed.
j、chfn与finger
chfn命令用于指定个人信息,finger用来查看个人信息。
chfn命令格式:
Usage: chfn [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] [ --help ] [ --version ] [root@localhost ~]# chfn Changing finger information for root. Name [root]: young Office []: geek Office Phone []: 010110110 Home Phone []: 0101101101 Finger information changed. [root@localhost ~]# finger root Login: root Name: young Directory: /root Shell: /bin/bash Office: geek, 010110110 Home Phone: 010-110-1101 On since Sun Jan 1 02:39 (CST) on pts/0 from 192.168.1.116 No mail. No Plan.
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2017-02/140312p2.htm
2.组管理命令
a、groupadd
groupadd命令用来创建组。
groupadd - create a new group synopsis: groupadd [options] group options: -g : 指定GID号 -r : 指定为一个系统组
实例:
[root@localhost ~]# groupadd -g 700 -r CentOS
b.groupmod与groupdel
groupmod命令用来修改组的属性,groupdel命令用来删除组。
groupdel - delete a group synopsis: groupdel GROUP_NAME groupmod - modify a group definition on the system synopsis: groupmod [options] GROUP options: -g : 修改GID号码 -n : 修改组名称 (groupmod -n NEW_GROUP OLD_GROUP)
实例:
[root@localhost ~]# groupmod -g 701 -n RedHat centos #修改属性 [root@localhost ~]# getent group redhat [root@localhost ~]# groupdel redhat #删除rehat组 [root@localhost ~]# getent group redhat [root@localhost ~]#
注:当有用户将该用户组作为主组时,无法直接删除该用户组,必须先删除用户。
c、gpasswd
gpasswd命令用来修改组密码。
gpasswd [OPTION] GROUP 设置组密码 -a user: 将user添加至指定组中; -d user: 从指定组中移除用户user -A user1,user2,…: 设置有管理权限的用户列表
实例:
将用户添加至组中,并设置管理员:
[root@localhost ~]# groupadd admins [root@localhost ~]# gpasswd -a user1 admins Adding user user1 to group admins [root@localhost ~]# gpasswd -A user1 admins [root@localhost ~]# getent group admins admins:x:1011:user1 [root@localhost ~]# gpasswd -a user2 admins Adding user user2 to group admins [root@localhost ~]# getent group admins admins:x:1011:user1,user2 [root@localhost ~]# getent gshadow admins admins:!:user1:user1,user2
设置组密码:
[root@localhost ~]# gpasswd admins Changing the password for group admins New Password: Re-enter new password:
d.newgrp
netgrp命令用来临时切换基本组。
newgrp - log in to a new group synopsis: newgrp [-] [group] - : 模拟用户登陆, 以实现重新初始化环境变量
实例:
[root@localhost ~]# su - user3 [user3@localhost ~]$ id uid=1009(user3) gid=1010(user3) groups=1010(user3) [user3@localhost ~]$ newgrp - admins Password: [user3@localhost ~]$ id uid=1009(user3) gid=1011(admins) groups=1011(admins),1010(user3) [user3@localhost ~]$
e、groupmems与groups
更改和查看组成员。
groupmems [options] [action] options: -g:更改为指定组(只有root) -a:指定用户加入组 -d:从组中删除用户 -p:从组中清除所有成员 -l:显示组成员列表
实例一:
[root@localhost ~]# groupmems -a user3 -g admins [root@localhost ~]# id user3 uid=1009(user3) gid=1010(user3) groups=1010(user3),1011(admins) [root@localhost ~]# groupmems -l -g admins user1 user2 user3 [root@localhost ~]# groupmems -p -g admins [root@localhost ~]# getent group admins admins:x:1011:
实例二:
[root@localhost ~]# groups user1 #查看用户user1的组信息 user1 : user1 root bin [root@localhost ~]#
3.管理文件权限
a、文件属性操作
chown 设置文件的所有者
chown[OPTION]… [OWNER][:[GROUP]] FILE… 设置文件的所有者和所有组 选项: -R: 递归修改 –reference=FILE1 FILE2… 以file1做参考文件修改file2的属主属组 OWNER 只修改属主 OWNER:GROUP 同时修改属主属组 :GROUP 只修改属主 命令中的冒号可用.替换; 用法: OWNER OWNER:GROUP :GROUP
实例:
[root@localhost cwn]# ll total 0 -rw-r--r-- 1 root root 0 Jan 1 06:30 test.txt [root@localhost cwn]# chown user1 test.txt [root@localhost cwn]# ll test.txt -rw-r--r-- 1 user1 root 0 Jan 1 06:30 test.txt [root@localhost cwn]# chown :user2 test.txt [root@localhost cwn]# ll test.txt -rw-r--r-- 1 user1 user2 0 Jan 1 06:30 test.txt [root@localhost cwn]# ll -d . drwxr-xr-x 2 root root 4096 Jan 1 06:30 . [root@localhost cwn]# chown -R root.root /root/cwn/ [root@localhost cwn]# ll test.txt -rw-r--r-- 1 root root 0 Jan 1 06:30 test.txt
chgrp 设置文件的属组信息
chgrp[OPTION]… GROUP FILE… 修改文件的属组 -R 递归 –reference=FILE1 FILE2… 以file1做参考文件修改file2的属组
实例:
[root@localhost cwn]# ll test.txt -rw-r--r-- 1 root root 0 Jan 1 06:30 test.txt [root@localhost cwn]# chgrp user1 test.txt [root@localhost cwn]# ll test.txt -rw-r--r-- 1 root user1 0 Jan 1 06:30 test.txt [root@localhost cwn]# ll -d . drwxr-xr-x 2 root root 4096 Jan 1 06:30 . [root@localhost cwn]# chgrp -R user3 /root/cwn [root@localhost cwn]# ll -d . drwxr-xr-x 2 root user3 4096 Jan 1 06:30 . [root@localhost cwn]# ll test.txt -rw-r--r-- 1 root user3 0 Jan 1 06:30 test.txt
4.文件权限说明
文件的权限主要针对三类对象进行定义:
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 011 3 r– 100 4 r-x 101 5 rw- 110 6 rwx 111 7 例如: 640: rw-r—– rwxr-xr-x: 755
文件权限操作命令chomod:
chmod[OPTION]… OCTAL-MODE FILE… chmod[OPTION]… MODE[,MODE]… FILE… -R: 递归修改权限 –reference=RFILE FILE… 以file1做参考文件修改file2的权限 MODE: 修改一类用户的所有权限: u= g= o= ug= a= u=,g= 修改一类用户某位或某些位权限 u+ u- g+ g- o+ o- a+ a- 例如: chmod u+wx,g-r,o=rx file chmod -R g+rwX /testdir chmod 600 file chmod o= file #取消其他用户对此文件的所有权限
新建文件和目录的默认权限
umask值可以用来保留在创建文件权限
新建FILE权限: 666 -umask
新建DIR权限: 777 -umask
普通用户的umask是002
root用户的umask是022
umask命令:
umask: 查看 umask #: 设定(umask 002) =====>临时设置umask umask –S 模式方式显示
修改全局设置:/etc/bashrc 用户设置:~/.bashrc永久修改umask
实例:
[root@localhost ~]# umask 0022 [root@localhost ~]# umask -S u=rwx,g=rx,o=rx [root@localhost ~]# umask 777 [root@localhost ~]# umask 0777
5、文件与目录的三种特殊权限及ACL
三种特殊权限SUID、SGID、SBIT
SetUID:
1. SUID权限仅对二进制程序有效; 2.执行者对改程序需要具有x的可执行权限; 3.本权限尽在执行该程序的过程中有效 4.执行者将具有改程序所有者的权限
权限设定:
chmod u+s FILE... chmod u-s FILE...
eg: 1. user1为普通用户对于/usr/bin/passwd这个程序来说是具有x的权限的,表示user1能执行passwd;
1.passwd的拥有者是root这个账号; 2./etc/shadow可以被user1所执行的passwd所修改; 注:SUID仅可用在二进制程序上,不能够用在shell script上面。所以SUID的权限部分,还是要看shell script调用进来的程序设置,而不是shell script本身。
SetGID 1. SGID对二进制程序来说需具备x的权限
1.SGID对二进制程序有用 2.执行者在执行的过程中将会获得改程序用户组的支持
除了二进制文件之外,事实上SGID也能够用在目录上,这也是常用的一种用途。当一个目录设置了SGID的权限后,他将具有如下功能: 1. 用户若对于此目录有r与x的权限时,该用户能进入该目录;
1.用户在此目录下的有效用户组将会变成该目录的有效用户组(有效用户组即是主组,不同叫法而已); 2.若用户在此目录下具有w权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同。
权限设定:
chmod g+s FILE|DIR... chmod g-s FILE|DIR...
Sticky Bit (SBIT)目前只针对目录有效,对文件已经没有效果了。
1.当用户对于此目录有w、x权限,即具有写入权限; 2.当用户在该目录下创建文件或目录时,仅自己与root才有权利删除该文件。 3.如果将A目录加上SBIT的权限项目时,则甲只能针对自己创建的文件或者目录进行删除、改名、移动等操作,而无法删除他人的文件。
权限设定:
chmod o+t DIR... chmod o-t DIR...
SUID/SGID/SBIT权限设置
4为SUID 2为SGID 1为SBIT
使用命令chmod为文件或者目录增加三种特殊权限,分别对应chmod u+s 文件名或者目录,chmod g+s 文件名或者目录,chmod o+t 文件名或者目录。
权限位映射:
SUID: user,占据属主的执行权限位 s: 属主拥有x权限 S:属主没有x权限 SGID: group,占据属组的执行权限位 s: group拥有x权限 S: group没有x权限 Sticky: other,占据other的执行权限位 t: other拥有x权限 T: other没有x权限
三种特殊权限的应用场景和作用:
Suid的应用场景和作用:Suid只对二进制程序起作用,程序发起者在程序执行的时候继承程序拥有者的身份以程序拥有者的权限,以程序拥有者的身份去执行程序。应用场景为root用户给普通用户分配需要经常改动的配置文件的修改权限比如密码passwd.
Sgid作用:对二进制程序的作用与Suid基本一致。对目录的作用,当目录设置Sgid时,若用户在此目录下所创建的新文件的用户组与此目录的用户组一致。应用场景:在开发的时候需要将开发的东西共享出来大家都可以随时加入新成员不用再设置所属组对共享文件进行查看修改。
Sticky:目录设置后,所有用户只能对自己创建的文件进行增删改查,无法对其他人的文件进行删除、移动、重命名等操作。
特殊权限数字法
SUID SGID STICKY 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 ~]#chmod 4777 /tmp/a.txt
6、主机的具体权限规划:ACL的使用
ACL:ACL是Access Control List的缩写,主要目的是提供传统的owner、group、others的read、write、execute权限之外的权限设置。ACL可以针对单一用户、单一文件或者目录进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有帮助。
CentOS7.0默认创建的xfs和ext4文件系统有ACL功能。 CentOS7.X之前版本,默认手工创建的ext4文件系统无ACL 功能。需手动增加: tune2fs –o acl /dev/sdb1 mount –o acl /dev/sdb1 /mnt ACL生效顺序:所有者,自定义用户,自定义组,其他人
查看方法:
[root@localhost ~]# dumpe2fs -h /dev/sda1 | grep 'Default mount' dumpe2fs 1.41.12 (17-May-2010) Default mount options: user_xattr acl
或者:
[root@localhost ~]# tune2fs -l /dev/sda1 | grep option Default mount options: user_xattr acl
mask说明:
权限掩码。用来控制你所设置的扩展ACL权限。你所设置的权限必须存于mask规定的范围内才会生效。也就是所谓的“有效权限(effective permission)”
设置mask实例:
[root@localhost ~]# ll test -rw-rwxr--+ 1 root root 0 Jan 1 21:05 test [root@localhost ~]# getfacl -e test # file: test # owner: root # group: root user::rw- user:user1:rwx #effective:rwx group::r-- #effective:r-- mask::rwx other::r-- [root@localhost ~]# setfacl -m m:r test [root@localhost ~]# getfacl -e test # file: test # owner: root # group: root user::rw- user:user1:rwx #effective:r-- group::r-- #effective:r-- mask::r-- other::r--
注:用户rwx的ACL设置信息。最终权限由mask控制,你所设置的权限必须在mask内,否则相对mask多出来的权限也是无效的。
主要针对几个项目控制权限:
1.用户:可以针对用户来设置权限 2.用户组:可以对用户组来设置权限 3.默认属性:还可以在该目录下在新建文件/目录时设置新数据的默认权限
ACL设置技巧:getfacl、setfacl
1.getfacl:取得某个文件或者目录的ACL设置项目; 2.setfacl:设置某个目录或者文件的ACL规定;
setfacl命令用法:setfacl [-bkRd] [{-m|-x} acl参数] 目录文件名
-m, --modify=acl:修改文件或目录的扩展ACL设置信息。 -M, --modify-file=file:从一个文件读入ACL设置信息并以此为模版修改当前文件或目录的扩展ACL设置信息。 -x, --remove=acl:从文件或目录删除一个扩展的ACL设置信息。 -X, --remove-file=file:从一个文件读入ACL设置信息并以此为模版删除当前文件或目录的ACL设置信息。 -b, --remove-all:删除所有的扩展的ACL设置信息。 -k, --remove-default:删除缺省的acl设置信息。 --set=acl:设置当前文件的ACL设置信息信息。 --set-file=file:从文件读入ACL设置信息来设置当前文件或目录的ACL设置信息。 --mask:重新计算有效权限,即使ACL mask被明确指定。 -n, --no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。 -d, --default:设置默认的ACL设置信息(只对目录有效)。 -R, --recursive:操作递归到所有子目录和文件。 -L, --logical:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。 -P, --physical:跳过所有符号链接,包括符号链接文件。 --restore=file:从文件恢复备份的acl设置信息(这些文件可由getfacl -R产生<---针对目录)。通过这种机制可以恢复整个目录树的acl设置信息。此参数不能和除--test以外的任何参数一同执行。 --test:测试模式,不会改变ACL设置信息。 -v, --version:显示程序的版信息。 -h, --help:显示帮助信息。
getfacl命令用法
getfacl [-aceEsRLPtpndvh] file... -a , --access:显示文件或目录的访问控制列表。 -d , --default:显示文件或目录的默认(缺省)的访问控制列表。 -c , --omit-header:不显示默认的访问控制列表。 -R , --recursive:操作递归到子目录。 -t , --tabular:使用列表输格式出ACL设置信息。 -n , --numeric:显示ACL信息中的用户和组的UID和GID。 -p , --absolute-names: -v , --version:显示命令的版信息 -h , --help:显示命令帮助信息。
设置acl实例:
getfacl file |directory #获取acl信息 setfacl -m u:young:rwx file|directory setfacl -Rm g:sales:rwX directory #递归设置directory下所有文件acl setfacl -m g:salesgroup:rw file| directory setfacl -m d:u:young:rx directory setfacl -x u:wang file |directory #删除制定的acl getfacl -e file | directory #获取有效权限(effective permission) setfacl -b file | directory #删除全部的acl setfacl -d -m u:young:rw directory ##这个目录下的所有文件和目录继承dirctory的acl权限 getfacl file1 | setfacl --set-file=- file2 #设置file2与file1相同的acl
注:acl设置成功后文件属性的权限最后一位有一个“+”号
[root@localhost ~]# ll host -rw-rw----+ 1 root root 59 Jan 1 20:48 host
备份和恢复ACL设置信息
[root@localhost testdir]# getfacl -R ./dir/ > acl.txt [root@localhost testdir]# cat acl.txt # file: dir/ # owner: root # group: root # flags: -s- user::rwx group::r-x group:g1:rw- mask::rwx other::r-x [root@localhost testdir]# setfacl -b -R ./dir/ [root@localhost testdir]# ll -d . drwxr-xr-x. 3 root root 4096 Aug 4 22:16 . [root@localhost testdir]# ll -d ./dir drwxr-sr-x. 2 root root 4096 Aug 4 22:07 ./dir [root@localhost testdir]# setfacl --restore=acl.txt [root@localhost testdir]# ll -d ./dir drwxrwsr-x+ 2 root root 4096 Aug 4 22:07 ./dir
补充命令:
设置文件特定属性与查看文件特殊属性命令chattr与lsattr
chattr +i 不能删除,改名,更改 chattr +a 只能增加 charttr -i | charttr -a去除 lsattr 显示特定属性
实例:
[root@localhost ~]# chattr +i host [root@localhost ~]# rm -fr host rm: cannot remove `host': Operation not permitted [root@localhost ~]# lsattr host ----i--------e- host [root@localhost ~]# chattr -i host [root@localhost ~]# lsattr host -------------e- host
(完)
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140312.htm