写在前面
这则笔记接着整理用户管理相关知识,主要包括以下内容:
文件目录权限回顾
用户管理
密码管理
用户权限更改
用户身份更改
文件目录权限回顾
文件主要类型
名称 | 释义 |
---|---|
d | 目录 |
- | 普通文件 |
l | 链接文件 |
b | 块设备,例如存盘分区文件 /dev/sda |
c | 串行端口设备文件,例如鼠标、键盘、打印机、tty终端 |
s | 嵌套字文件,用于进程通讯 |
3种权限回顾
名称 | 权限名称 | 数字描述 | 解释 |
---|---|---|---|
r | 读权限(read) | 4 | 可以打开文件、目录读取查看; |
w | 写权限(write) | 2 | 对文件、目录可以编写更改 |
x | 执行权限(execute) | 1 | 对文件可执行(可执行文件)、对目录可查找该目录下的内容 |
权限所属对象
名称 | 权限名称 | 解释 |
---|---|---|
u | 用户(user) | 生成文件或目录时登录的当前用户 |
g | 组(group) | 所属群组 |
0 | 其他人(others) | 除拥有者,同组人以外的人 |
a | 所有人(all) | 包括拥有者、同组人及其他人 |
举个栗子
如图所示,可分为7个部分:
代表这个文件的类型与权限(permission),例如第一行
-rw-r--r--.
,包含的信息包括:第1位-
表示这是一个普通文档;第2位至第10位rw-r--r--
,按照数字表示,也可以写为644;第11位.
在centos5之前是没有这一位的;之后的版本(centos6、centos7)如果使用了SElinux content属性,这里是.
;如果使用了acl属性,这里是+
。表示有多少档名连结到此节点(i-node);
表示这个文件(或目录)的拥有者账号;
表示这个文件的所属群组;
表示这个文件的容量大小,默认单位为bytes;
表示这个文件的创建日期或最近修改日期;
表示这个文件的名字;
用户管理
用户权限概念
user 用户:
在linux当中,每个用户有一个唯一的uid (user identification)用来标示用户身份,这个道理大概就跟每个中国人有一个唯一的身份证号码一样。
在centos 7 中,有以下三种用户:
身份 | uid | 说明 |
---|---|---|
系统管理员 | 0 | 系统超级管理员,即root,拥有最高权限 |
系统用户 | 1-999 | 系统预留,linux默认服务程序都会有独立的系统用户进行运行,这部分账户由系统预留,我们设置普通账户的时候,不能将uid设为这个数字段 |
普通用户 | 1000以上 | 系统普通用户,系统权限受限,由root用户管理,uid从1000开始 |
group 组:
group的概念,跟班级的概念类似,主要是方便Linux系统权限管理。每个用户只能从属于一个基本组,但可以加入多个拓展组。做个类别,不如张三是三年二班(基本组)的学生,但可以同时加入天文组、计算机组、唱诗班(拓展组),大概是这么个意思。
在linux中,用户权限管理的配置文件主要包括:
/etc/passwd
存放用户信息,每条信息依次为:用户名/口令(这里只有星号,真正的密码在/etc/shadow
中)/uid/gid(默认与uid相同)/描述注释/home目录/登陆shell;/etc/group
存放组信息,每条信息依次为:组名/口令/gid/组成员列表;/etc/shadow
,存放密码信息,每条信息依次为:登录名/加密口令/最后一次修改时间/最小修改间隔/最大修改间隔/警告时间/不活动时间;
用户配置文件/etc/passwd
使用命令: cat /etc/passwd | head
如上图所示,共有7个字段,具体含义如下:
字段 | 含义 | 备注 |
---|---|---|
1 | user name,用户名 | 用户名可以由大小写字母、数字、减号、点或者下划线构成 |
2 | password | 由于安全因素,这里的password 被放在/etc/shadow 当中,这里用x 代替。 |
3 | uid | 用户标示号,root用户的uid是0;uid1000以内的系统预留,普通标示号从1000开始 |
4 | gid | 组标示号 |
5 | 注释说明 | 如姓名、电话、地址等,可以用 chfn 命令进行更改 |
6 | 用户家目录 | root 的家目录为 /root ;普通用户的家目录为 /home/username |
7 | 用户的shell | 常见的shell包括:bash 、zsh 、ksh 等。另外,该字段还有/sbin/nologin,表示不允许该账号登陆 |
用户和用户组管理
增加用户 useradd命令
命令行格式:
1 | useradd [参数] [username] |
常用参数 | 含义 |
---|---|
-u | 自定义uid |
-g | 添加到已存在的某个组,后面可以是gid,也可以是组名 |
-d | 自定义家目录 |
-M | M为大写,不建立家目录 |
-s | 自定义shell |
示例:
- 不带参数,创建与当前用户同组的用户
1 | useradd uesr1 |
g
添加到已经存在的某个组;如果gid不存在,则会报错
1 | useradd -g root user2 |
M
不创建家目录
1 | useradd -M user3 |
删除用户 userdel命令
命令行格式:
1 | userdel [参数] [username] |
-r
参数的作用是,同时删除用户及用户家目录;如果省略,则只删除用户,保留用户家目录。
示例:
1 | userdel -r user1 |
添加组 groupadd
命令
命令行格式:
1 | groupadd [-g gid] [groupname] |
-g
为可选参数,用来定义gid,可以不添加。
示例:
1 | groupadd -g 1000 group1 |
删除组 groupdel
命令
命令行格式:
1 | groupdel [groupname] |
示例:
1 | groupdel group1 |
注,如果改组中包含用户,就不可以直接删除,原理类似于 rmdir
不能删除非空目录。
更改用户属性 usermod
命令
命令行格式:
1 | usermod [参数] [userName] |
常用参数 | 解释 |
---|---|
-c | <备注>:修改用户帐号的备注文字; |
-d | <登入目录>:修改用户登入时的目录; |
-e | <有效期限>:修改帐号的有效期限; |
-f | <缓冲天数>:修改在密码过期后多少天即关闭该帐号; |
-l | 修改用户帐号名称; |
-s | 修改用户登入后所使用的shell; |
-u | uid,修改用户ID; |
-g | <群组>:修改用户所属的群组; |
-G | <群组>;修改用户所属的附加群组; |
-L | 锁定用户密码,使密码无效; |
-U | 解除密码锁定。 |
举例:
1 | usermod -u 1008 user1 //更改uid |
注:使用-g
只能修改用户所属的一个组;使用-G
能够添加到若干个附加组。
通过 -s
禁止用户登陆
命令行 useermod -s [pathToShell] [UserName]
可以修改用户登入后使用的shell,也就是/etc/passwd
第7列第内容,因此也可以利用 /sbin/nologin
和/bin/false
的特性,实现禁止用户登陆的目的。
/sbin/nologin
:不允许系统login,可以使用ftp等其他服务;/bin/false
:最严格的禁止login选项,一切服务都不能用,
示例:
1 | usermod -s /sbin/nologin user1 //不允许user1用户登陆,但可以使用ftp; |
用户密码管理
密码配置文件/etc/shadow
查看命令: cat /etc/shadow | head -n 3
通过上述命令查询到了shadow 文件的前三行内容,每行共分9段,含义如下:
字段 | 含义 |
---|---|
1 | 用户名,username |
2 | password,此处显示的是加密之后的密文;注:centOS 7的密码是通过sha-512加密的 |
3 | 上次更改密码的时间,此处的时间是以1970年1月1日为起点算传来的 |
4 | 经过多少天密码才可以修改,默认是0 ,表示不受限制 |
5 | 多少天后密码到期,默认设为99999(大概是273年?) |
6 | 密码到期前的警告期限,默认是7 |
7 | 密码到期后的失效期限 |
8 | 密码的生命周期,计算方法跟3一样 |
9 | 保留字段 |
设置用户密码 passwd
命令
语法: passwd [username]
注意:
root 用户使用此命令,不加 username 表示更改root 密码;加上username 表示修改该指定用户的密码;
普通用户只能修改自己的密码。
密码设置的基本原则:
长度不小于10个字符;
密码包括大小写字母、数字、特殊字符(如*、&、%)等;
不规则(不要用常用单词或者数字);
不使用带有自己的名字、电话、生日及公司名称等。
passwd
用法
/etc/shadow
中第二列表示密码,此处为!!
表示密码为空;此处为*
表示密码锁定。这两种情况下,账户都是不允许登陆。
- 锁定和解锁账户
1 | passwd -l username //锁定用户 |
- 使用
usermode
命令也可以实现同样的效果
1 | usermod -L username //锁定用户 |
- 设定密码
passwd --stdin username
注:此处密码只需要输入一次,而且是明文显示的。
- 使用管道符,通过一行命令更改用户密码
- 使用参数
-e
,通过一行命令更改密码, 例如echo -e 'abc123456\nabc123456' | passwd user1
生成密码 mkpasswd 命令
linux系统默认没有此命令,需要单独安装 yum -y install expect
基本用法:
- 不加任何参数,默认生成9位密码
- 生成指定长度的密码
passwd -l n
n代表数,即长度为多少位
- 指定特殊字符和数字
passwd -l n -s n -d n
l
表示密码长度s
表示特殊字符d
表示数字
用户文件权限管理
文件管理与用户管理结合是在一起的,linux支持对不同的组别、用户分别设置不同的权限。因此,在进行权限管理的时候,有两种基本思路:
直接修改改文件权限设置;
更改文件的用户名及所属组;
下面分别对这两种思路进行总结:
用户文件权限更改
chmod 更改文件权限
第一种方式:chmod命令直接更改
命令格式:
1 | chmod [ -R ] [number ] [文件名或目录] |
如前文所述,在描述文件权限的时候,可以用4代表r(read)、2代表w(write)、x代表 execute(执行);
在linux中,目录的默认权限为755,即(user:rwx
;group:rx
;others:rx
);文件的默认权限为644 ,即(user:rw
;group:r
;others:r
)
这里的-R
是可选项,表示级联修改,chmod [ -R ] [number ] [目录]
, 不但会更改目录权限,连同目录下的文件权限也一并更改。
第二种方式:针对某个分组设置权限
- 文件所有者:
chmod u+x a1/1.txt
- 文件所属组:
chmod o=rwx a1/1.txt
- 其他用户:
chmod o-x a1/1.txt
- 所有用户:
chmod a+x a1/1.txt
注意:a代表all(所有组别及用户)
更改文件的所有者及所属组
chown 更改所有者和所属组
chown (change owner) 既可以更改文件所有者,也可以连同所属组一起更改。具体用法:
- 更改所有者:
chown [用户名] [文件名]
- 同时更改所有者和所属组:
chown [ -R ] [用户名:组名] [文件名或目录名]
chgrp 更改所属组(change group)
命令行格式: chgrp [组名] [文件名/目录名]
- 更改文件所属组
chgrp [组名] [文件名]
如下图所示,所属组由 root
改为test-1-group
- 更改目录所属组
chgrp [组名] [目录名]
默认只更改目录所属组,如下图所示,文件夹a1所属组已经由root
改为 test-1-group
;而文件夹 a1
中的b2
所属组仍为 root
,并未改变。
- 如果希望一次性都改掉,则需要使用参数
-R
,格式为chgrp -R [所属组] [目录名]
umask 默认权限设置
注: 一般不用修改文件默认权限,因此这一小节仅作为了解内容。
默认情况下,目录的权限为755,即 rwxr-xr-x
;默认普通文件的权限为644,即 rw-r--r--
;
输入 umask
,可以查询默认权限;root账户的默认值为root账户为0022
,一般用户为0002
。以root用户为例,是将数字转为rwx,之后再“减去”相应的全选。具体而言,
第一位表示这是一个八进位制数字,没有特别含义,不用管它;
此时文件夹权限为777 - 022 = 755,即
rwxrwxrwx
-----w--w-
=rwxr-xr-x
此时文件权限为666 - 022 = 644 ,即
rw-rw-rw-
-----w--w-
=rw- r--r--
文件默认权限,可以通过 umask [number]
来更改,方法参照前面的例子即可。
用户身份切换
查询当前用户 whoami
命令
注:root 用户前面是 #
;切换到普通用户后,前面是 $
.
处于安全考虑,建议使用普通用户,而不是root
用户进行日常管理,需要的时候再使用su
或者 sudo
临时使用管理员权限。
切换用户:su
命令
语法: su [-] username
- 不使用
-
,切换root,仍然在当前家目录,环境变量并不改变
- 使用
-
切换 root,同时切换环境变量
注:从root用户切换到普通用户,不需要输入密码;反之,普通用户切换到root用户则需要输入密码。
- 临时切换用户运行一条命令
su - -c [command] [username]
sudo 命令
使用su
命令有密码泄露的风险,因此sudo
的用武之地。使用 sudo [command]
,可以让普通用户执行只有 root
用户有权执行的命令。
使用sudo
命令需输入当前用户的密码,而不是系统管理员root
的密码,这样就降低root密码扩散是风险,有助于提升系统用户的安全性。
sudo -i
为了频繁使用root用户权限使用的命令,该命令的特性包括:
- 提示输入密码时该密码为当前账户的密码;
- 密码只用输入一次;
- 没有时间限制。
- 执行该命令后提示符变为
#
而不是$
; - 退回普通账户时可以执行
exit
或logout
;
su
和 sudo
进阶:visudo
su
和sudo
的存在,实际上涉及到一套linux的分级授权方法,用户权限配置文件是/etc/sudoers
,通过给予不同级别的用户(root用户、系统用户、普通用户)设置不同的权限,来规避安全风险。
以root的权限设置为例,关键是下面这一行:
root 表示这是root用户,下面的几个all的意思是:
第一个ALL,表示”From ALL hosts”(所有主机), 意思是
root
从任何机器登录,都可以应用接下来的规则。第二个ALL,表示“run as All user”,意思是
root
可以以任何用户的身份运行一些命令。第三个ALL,表示“run All commands”,意思是
root
可以以任何用户组的身份运行任何命令。
上面几个ALL合起来的意思是,root
这个用户可以从任何机器登录,以任何用户和用户组的身份运行任何命令。
在实践中,我们也可以通过修改/etc/sudoers
,达到自定义授权的目的。在这里,我们需要借助visudo
这个工具。它会自动校验配置文件,检查配置文件改动语法是否有错误,使用起来也就更安全。
visudo
不是系统自带工具,需要单独安装。这也从一个侧面反映出,系统授权机制修改存在一定的风险,系统设计者不希望root用户随意修改默认设置。
visudo
安装
1 | yum install -y sudo |
visudo
基本使用
1 | visudo //打开编辑`/etc/sudoers` |
基本使用根vi/vim差不多,h、l、k、j
进行方向选择;x
删除单个字符,dd
删除整行;/
向后搜索,?
向前搜索;按i
进入编辑模式。
保存退出:按esc ,输入 :wq ; 如果出现错误,在保存退出的时候会有提示:
e
返回进行修改,确认没有问题后再正常保存退出;w! 强制保存(严重不推荐);
案例一:普通用户可执行ls、mv、cat命令
方法一:
- 修改用户权限配置
注: /usr/bin/ls, /usr/bin/mv, /usr/bin/cat 需要修改成绝对路径才能够正常使用。
- 保存退出,提示93行有错误,原来是刚才的路径写错了,应该从
/
根目录写起,修改后重新保存。
- 检验一下工作成果,初次使用会有风险提示,但是看起来很拽有木有!输入密码后可以拥有
super power
了。如下图:
方法二:
- 设置命令别名
再修改账户权限
保存退出,结果也是一样的。
案例二: 普通用户免密码就使用sudo
为了满足在防止root密码泄漏的同时,最大限度满足系统用户需要以root身份运行的需求,可以采取以下策略,使得用户可以以普通身份登陆,之后再免密切换到root用户。
基本思路:配置文件中加入以下几行内容:
1 | USER_Alias_USER_SU = yuanfeng, user1 //设置用户alias |
- 创建一个user alias
- 设置一个规则免密执行su命令登录root
- 检验一下学习成果,普通用户输入
sudo su -
,免密切换到root用户。
- 还可以禁止root用户远程登录,实现步骤:编辑/etc/ssh/sshd_config,将
PermitRootLogin yes
中的yes
改为no
,保存退出后,重启sshd
服务。
1 | systemctl restart sshd.service |