0%

Linux运维学习笔记:centOS用户和文件管理(二)

写在前面

这则笔记接着整理用户管理相关知识,主要包括以下内容:

  • 文件目录权限回顾

  • 用户管理

  • 密码管理

  • 用户权限更改

  • 用户身份更改

文件目录权限回顾

文件主要类型

名称 释义
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个部分:

  1. 代表这个文件的类型与权限(permission),例如第一行-rw-r--r--.,包含的信息包括:第1位 - 表示这是一个普通文档;第2位至第10位rw-r--r--,按照数字表示,也可以写为644;第11位 . 在centos5之前是没有这一位的;之后的版本(centos6、centos7)如果使用了SElinux content属性,这里是 .;如果使用了acl属性,这里是+

  2. 表示有多少档名连结到此节点(i-node);

  3. 表示这个文件(或目录)的拥有者账号;

  4. 表示这个文件的所属群组;

  5. 表示这个文件的容量大小,默认单位为bytes;

  6. 表示这个文件的创建日期或最近修改日期;

  7. 表示这个文件的名字;

用户管理

用户权限概念

  • 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包括:bashzshksh 等。另外,该字段还有/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
2
3
4
5
6
7
8
9
usermod -u 1008 user1     //更改uid

usermod -g 10098 grp2 //更改gid

usermod -d /home/user123 user4 //更改user4的家目录

usermod -G grp1 grp2 //修改附加组

usermod -g groupname username //更改用户组

注:使用-g 只能修改用户所属的一个组;使用-G能够添加到若干个附加组。

通过 -s 禁止用户登陆

命令行 useermod -s [pathToShell] [UserName] 可以修改用户登入后使用的shell,也就是/etc/passwd第7列第内容,因此也可以利用 /sbin/nologin/bin/false的特性,实现禁止用户登陆的目的。

  • /sbin/nologin :不允许系统login,可以使用ftp等其他服务;

  • /bin/false :最严格的禁止login选项,一切服务都不能用,

示例:

1
2
3
usermod -s /sbin/nologin user1 //不允许user1用户登陆,但可以使用ftp;

usermod -s /bin/false user1 //禁止user1 用户登陆,神马都不能做。

用户密码管理

密码配置文件/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]

注意:

  1. root 用户使用此命令,不加 username 表示更改root 密码;加上username 表示修改该指定用户的密码;

  2. 普通用户只能修改自己的密码。

密码设置的基本原则:

  • 长度不小于10个字符;

  • 密码包括大小写字母、数字、特殊字符(如*、&、%)等;

  • 不规则(不要用常用单词或者数字);

  • 不使用带有自己的名字、电话、生日及公司名称等。

passwd用法

  • /etc/shadow 中第二列表示密码,此处为!! 表示密码为空;此处为* 表示密码锁定。这两种情况下,账户都是不允许登陆。

  • 锁定和解锁账户
1
2
passwd -l username //锁定用户
passwd -u username //解锁用户
  • 使用usermode命令也可以实现同样的效果
1
2
usermod -L username   //锁定用户
usermod -U 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支持对不同的组别、用户分别设置不同的权限。因此,在进行权限管理的时候,有两种基本思路:

  1. 直接修改改文件权限设置;

  2. 更改文件的用户名及所属组;

下面分别对这两种思路进行总结:

用户文件权限更改

chmod 更改文件权限

第一种方式:chmod命令直接更改

命令格式:

1
chmod [ -R ] [number ] [文件名或目录]

如前文所述,在描述文件权限的时候,可以用4代表r(read)、2代表w(write)、x代表 execute(执行);

在linux中,目录的默认权限为755,即(user:rwxgroup:rxothers:rx);文件的默认权限为644 ,即(user:rwgroup:rothers: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用户权限使用的命令,该命令的特性包括:

  • 提示输入密码时该密码为当前账户的密码;
  • 密码只用输入一次;
  • 没有时间限制。
  • 执行该命令后提示符变为#而不是$
  • 退回普通账户时可以执行exitlogout

susudo进阶:visudo

susudo的存在,实际上涉及到一套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
2
3
USER_Alias_USER_SU = yuanfeng, user1   //设置用户alias
Cmnd_Alias_SU = /usr/bin/su //设置权限alias
USERS_SU ALL = (ALL) NOPASSWD: SU //设置免密su
  • 创建一个user alias

  • 设置一个规则免密执行su命令登录root

  • 检验一下学习成果,普通用户输入 sudo su -,免密切换到root用户。

  • 还可以禁止root用户远程登录,实现步骤:编辑/etc/ssh/sshd_config,将 PermitRootLogin yes 中的yes改为no,保存退出后,重启sshd服务。
1
systemctl restart sshd.service

扩展阅读

sudo与su比较

sudo配置文件样例

sudo -i 也可以登录到root吗?

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!