您的位置:首页 > 运维架构 > Linux

linux-运维进阶-10 用户权限与文件权限

2019-03-26 20:43 387 查看

linux-运维进阶-10 用户权限与文件权限

用户权限

uid(user id)和gid(group id)

root用户的uid和gid都是0

系统用户uid为1-999

普通用户的uid从1000开始:由管理员创建的日常使用的用户

(UID和GID不需要一一对应)

将普通用户的UID设置为0 ,那这个用户也就是root用户了

用户操作

useradd [username]

新建一个用户zhangsan

新建一个用户lisi,指定其家目录为/home/userlisi,指定他的登录shell为zsh

从passwd文件中查看出上述两个用户的uid、git、家目录、登录shell信息

用id命令可以查看用户的基本信息

使用usermod命令修改已有用户的信息(其参数和useradd几乎一样),例如将李四的登录shell改为bash

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# grep zhangsan /etc/passwd
zhangsan:x1009:1009::/home/zhangsan:/bin/bash
[root@localhost ~]# useradd lisi -d /home/userlisi -s /bin/zsh
[root@localhost ~]# grep lisi  /etc/passwd
lisi:x1010:1010::/home/userlisi:/bin/zsh
[root@localhost ~]# id zhangsan
uid=1009(zhangsan) gid=1009(zhangsan) groups=1009(zhangsan)
[root@localhost ~]# id lisi
uid=1010(lisi) gid=1010(lisi) groups=1010(lisi)
[root@localhost ~]# usermod lisi -d /home/userlisi -s /bin/bash
[root@localhost ~]# grep lisi  /etc/passwd
lisi:x:1010:1010::/home/userlisi:/bin/bash
[root@localhost ~]#

参数

useradd 参数 作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为YYYY-MM-DD.
-u 指定该用户的默认UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认Shell解释器

查看用户id、uid、主组和附属组

id 用户名

例如
[root@node2 ~]# id feng
uid=1024(feng) gid=0(root) 组=0(root)

目录

/目录 、/home目录 、~目录的区别

/ :根目录

/home :家目录(可以理解为用户列表目录),你创建的所有用户的家目录默认会在/home目录下
:当前用户的家目录

查看这台虚拟机有哪些用户,到家目录/home下即可

[root@localhost ~]# cd /home
[root@localhost home]# ls
aaa  aaawww  bbb  bbbwww  ccc  cccwww  ddd  dddwww  testuser  userlisi  zhangsan
[root@localhost home]#

删除用户

注意:不要小看删除用户,很多时候咱们都会忘了敲参数-r,以导致该用户的其他信息未能被一起彻底删除,于是再次添加该用户的时候就无法添加上去了,所以两种删用户的方式都要掌握!

完全删除用户账号(也就是删除所有与该用户相关的文件)

注意:判断你删除是否彻底是否成功的标准是,如果你删除了还能给它加回来那就是成功的,加不回来的话那你的删除就是失败的或者说不彻底的!

方式一:

userdel -r 用户名

以用户zzz为例:

[root@localhost ~]# cd /home/
[root@localhost home]# ls
[root@localhost home]# useradd zzz
[root@localhost home]# ls
zzz
[root@localhost home]# userdel -r zzz
[root@localhost home]# ls
[root@localhost home]# useradd zzz
[root@localhost home]# ls
zzz

你看,删掉了用户zzz,还能加回来,这次删除就是成功的!

方式二:

userdel 用户名							#删除账户和组的信息,但是/home下还能看到该用户的家目录
find / -name "*用户名*" | xargs rm -rf	#彻底删除用户其他信息

接着上面的命令继续以用户zzz为例:

[root@localhost home]# userdel zzz
[root@localhost home]# ls
zzz
[root@localhost home]# find / -name "*zzz*" | xargs rm -rf
[root@localhost home]# ls
[root@localhost home]# useradd zzz
[root@localhost home]# ls
zzz
[root@localhost home]#

你看,删掉了用户zzz,还能加回来,这次删除就是成功的!

失败案例(删除不彻底导致删除后无法再加回来)

接着上面的命令以用户qqq为例:

[root@localhost home]# useradd qqq
[root@localhost home]# userdel qqq
[root@localhost home]# useradd qqq
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@localhost home]# find / -name "*qqq*" | xargs rm -rf
[root@localhost home]# ls
zzz
[root@localhost home]# useradd qqq
useradd: user 'qqq' already exists

注意:失败了之后,那你可以参考下述命令补救,然后彻底将该用户删除。
[root@localhost home]# userdel qqq
[root@localhost home]# find / -name "*qqq*" | xargs rm -rf
[root@localhost home]# useradd qqq
[root@localhost home]# ls
qqq  zzz
[root@localhost home]#

补救成功!

用户组

主组

创建用户的时候系统会同时创建一个和这个用户名同名的组,这个组就是主组,不可以把用户从主组中删除。

当然,在创建用户的时候如果你使用使用了-g参数,该用户就可加入和用户不同名的用户组作为该用户的主组。

也可以创建用户之后,再使用usermod -g来改变用户的主组,然鹅这样和用户同名的组依然会存在,并不会被删除。

附属组

除了主组之外,用户所在的其他组 4000 ,都是附属组。用户是可以从附属组中被删除的。

用户的从属组,并不会影响主组,useradd时用-G参数来加入,同时用户主组默认是那个和用户同名的组。

创建用户之后,可以用usermod -G加入其他的附属组,而且之前加入的组不会退掉。

主组与附属组的区别与联系

一个用户可以属于多个附属组。但是一个用户只能有一个主组。

创建一个用户组feng,在/etc/group下可看到该组,然后把它删除掉,然后再加回来。可以看到删组可以不用加参数。

[root@localhost ~]# groupadd feng
[root@localhost ~]# grep feng /etc/group
feng:x:1000:
[root@localhost ~]# groupdel feng
[root@localhost ~]# grep feng /etc/group
[root@localhost ~]# groupadd feng
[root@localhost ~]# grep feng /etc/group
feng:x:1000:
[root@localhost ~]#
grep feng /etc/group
feng:x:1000:
[root@localhost ~]#

创建用户组afeng,bfeng,cfeng

[root@localhost ~]# groupadd afeng
[root@localhost ~]# groupadd bfeng
[root@localhost ~]# groupadd cfeng

创建用户aaa,并且其主组设置为afeng

[root@localhost ~]# useradd aaa -g afeng
[root@localhost ~]# cat /etc/passwd | grep aaa
aaa:x:1000:1001::/home/aaa:/bin/bash			#可以看到aaa的GID为1001,对应的组为afeng
[root@localhost ~]# cat /etc/group | grep feng
feng:x:1000:
afeng:x:1001:
bfeng:x:1002:
cfeng:x:1003:

创建用户bbb,本来默认其主组是bbb,修改其主组为bfeng

[root@localhost ~]# cat /etc/group | grep feng	#先看看各个附属组的GID
feng:x:1000:
afeng:x:1001:
bfeng:x:1002:
cfeng:x:1003:
[root@localhost ~]# useradd bbb
[root@localhost ~]# cat /etc/passwd | grep bbb
bbb:x:1001:1004::/home/bbb:/bin/bash			#可以看到本来bbb的GID是1004,对应的组是bbb
[root@localhost ~]# cat /etc/group | grep bbb
bbb:x:1004:
[root@localhost ~]# usermod bbb -g bfeng
[root@localhost ~]# cat /etc/passwd | grep bbb
bbb:x:1001:1002::/home/bbb:/bin/bash			#现在bbb的GID是1002,对应的组也就是bfeng
[root@localhost ~]#

创建用户ccc,其主组设置为cfeng,其附属组有:afeng、bfeng

[root@localhost ~]# useradd ccc -g cfeng -G afeng,bfeng
[root@localhost ~]# cat /etc/group | grep feng
feng:x:1000:
afeng:x:1001:ccc								#可以看到afeng、bfeng下附属有ccc
bfeng:x:1002:ccc
cfeng:x:1003:
[root@localhost ~]# cat /etc/passwd | grep ccc
ccc:x:1002:1003::/home/ccc:/bin/bash			#可以看到ccc的GID为1003,对应的组为cfeng
[root@localhost ~]#

用户的主组在/etc/passwd文件中的gid字段体现,并不会在/etc/group文件中体现出来

用户的附属组在/etc/group文件中体现,并不会在/etc/passwd文件中体现

设置用户密码

passwd 用户名
交互式输入密码

为用户aaa设置密码

[root@localhost ~]# passwd aaa
Changing password for user aaa.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]#

上述密码设置已经成功,至于BAD PASSWORD:忽略掉即可,想要了解可以浏览我博客的另一篇文章:linux-基础学习-02 Linux系统介绍和安装,这篇文章详细讲解了设置密码时遇到的N种情况。

锁定用户密码

[root@localhost ~]# passwd -l aaa
Locking password for user aaa.
passwd: Success
[root@localhost ~]# passwd -S aaa			#查看密码状态
aaa LK 2019-01-18 0 99999 7 -1 (Password locked.)
[root@localhost ~]# passwd -u aaa			#解锁密码
Unlocking password for user aaa.
passwd: Success
[root@localhost ~]# passwd -S aaa
aaa PS 2019-01-18 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@localhost ~]#

使用非交互式(系统标准输入)设置用户密码(不安全)

[root@localhost ~]# echo "123456" | passwd --stdin aaa
Changing password for user aaa.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# history 5				#用history查看最近输入该的5条命令
81  passwd -S aaa
82  echo "123456" | passwd aaa
83  echo "123456" | passwd --stdin aaa	#完了,密码露馅了
84  history -5
85  history 5
[root@localhost ~]#

文件权限

文件的分类

Linux系统使用了不同的字符来加以区分,常见的字符如下所示。

  • -:普通文件。
  • d:目录文件。
  • l:链接文件。
  • b:块设备文件。
  • c:字符设备文件。
  • p:管道文件。
权限分配 文件所有者 文件所有者 文件所有者 文件所属组 文件所属组 文件所属组 其他用户 其他用户 其他用户
权限项 执行 执行 执行
字符表示 r x w r w x r w x
数字表示 4 1 2 4 2 1 4 2 1

chmod

修改文件权限的命令

用法

chmod [user]+[ r | w| x ] file
chmod [user] -[ r | w| x ] file

注意: 如果不加user的话,那么所有的用户的执行权限都会被加上,其他权限只对当前用户生效

例如:

chmod 755 file
chmod 750 file

更改一个文件的归属权

chown [user] file

例如:

[root@localhost ~]# ll
#一开始,hello.sh是root组下的root用户的文件
-rw-r--r--. 1 root root    0 Jan 23 04:14 hello.sh

[root@localhost ~]# chown aaa hello.sh
[root@localhost ~]# ll
#改成aaa用户的文件
-rw-r--r--. 1 aaa  root    0 Jan 23 04:14 hello.sh

[root@localhost ~]# chown bbb:bfeng hello.sh
[root@localhost ~]# ll
#改成bfeng组下的bbb用户的文件
-rw-r--r--. 1 bbb  bfeng    0 Jan 23 04:14 hello.sh

[root@localhost ~]# chgrp afeng hello.sh
[root@localhost ~]# ll
#改成归属afeng组的文件
-rw-r--r--. 1 bbb  afeng    0 Jan 23 04:14 hello.sh

[root@localhost ~]#

文件特殊权限

SUID

让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)

[root@localhost ~]# ll hello.sh
-rw-r--r--. 1 bbb afeng 0 Jan 23 04:14 hello.sh
[root@localhost ~]# chmod u+s hello.sh
[root@localhost ~]# ll hello.sh
-rwSr--r--. 1 bbb afeng 0 Jan 23 04:14 hello.sh
[root@localhost ~]#

SGID和SUID同理

SBID

当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作。

当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。

[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
[root@localhost test]# touch hello.sh
[root@localhost test]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 23 04:33 hello.sh
[root@localhost test]# chmod -R o+t hello.sh
[root@localhost test]# ll
total 0
-rw-r--r-T. 1 root root 0 Jan 23 04:33 hello.sh
[root@localhost test]# su aaa
[aaa@localhost test]$ rm -f hello.sh
rm: cannot remove ‘hello.sh’: Permission denied

文件的隐藏属性

chattr

chattr命令用于设置文件的隐藏权限,格式为

chattr [参数] 文件
参数 作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件中的内容

lsattr

[root@localhost test]# chattr +a hello.sh
[root@localhost test]# lsattr hello.sh
-----a---------- hello.sh
[root@localhost test]# chattr -a hello.sh
[root@localhost test]# lsattr hello.sh
---------------- hello.sh
[root@localhost test]#

文件权限扩展权限设置

setfacl

题目:

创建文件/root/testfacl,其文件所属者和组都是root

系统中有aaa,bbb和ccc三个用户,

root用户对testfacl有最高权限

aaa用户对testfacl有可读可写可执行权限

bbb用户对testfacl有可读可写权限

ccc用户对testfacl有可读权限

用户组中的用户对testfacl文件有可读可执行权限

用户组cfeng对testfacl有可读权限

其他用户对testfacl没有任何权限

命令:

[root@localhost ~]# touch testfacl
[root@localhost ~]# ll testfacl
-rw-r--r--. 1 root root 0 Jan 23 04:49 testfacl
[root@localhost ~]# setfacl -m u:root:rwx,u:aaa:rwx,u:bbb:rw-,u:ccc:r--,g::r-x,g:cfeng:r--,o::--- testfacl
[root@localhost ~]# ll testfacl
-rw-rwx---+ 1 root root 0 Jan 23 04:49 testfacl
[root@localhost ~]#

getfacl

查看文件扩展属性

[root@localhost ~]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:root:rwx
user:aaa:rwx
user:bbb:rw-
user:ccc:r--
group::r-x
group:cfeng:r--
mask::rwx
other::---

[root@localhost ~]#

切换用户

su

​ su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。

[root@localhost ~]# su aaa
[aaa@localhost root]$ id
uid=1000(aaa) gid=1001(afeng) groups=1001(afeng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[aaa@localhost root]$ su root
Password:
[root@localhost ~]# su - aaa
Last login: Wed Jan 23 04:56:46 EST 2019 on pts/0
[aaa@localhost ~]$ id
uid=1000(aaa) gid=1001(afeng) groups=1001(afeng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[aaa@localhost ~]$

尴尬的是,root和aaa恰好环境变量信息是一样的,唉算了就这样吧,加个减号也不费事

sudo

sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为

sudo [参数] 命令名称

sudo命令具有如下功能:

  • 限制用户执行指定的命令:
  • 记录用户执行的每一条命令;
  • 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
  • 验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u用户名或UID值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

visudo

举例:使用visudo命令配置sudo命令的配置文件

[root@localhost ~]# visudo

98 ## Allows people in group wheel to run all commands
99 %wheel  ALL=(ALL)       ALL
100 root 	ALL=(ALL) 		ALL
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: