为什么引入用户和组?
安全性
—权限管理(哪些文件某个用户可以读写、哪些进程某个用户可以启动)
—资源管理(存储资源、IO、CPU资源)
[root@localhost ~]# id root
uid=0(root) gid=0(root) 组=0(root)
每个用户有唯一uid和gid
一个用户可以有不同的组
一个组可以有不同的用户
useradd增 userdel 删 usermod改 users查(查看当前登录用户)
创建一个用户会牵扯到哪些文件?
默认情况下,创建用户会添加一个和用户同名的组,默认将这个用户加入这个组
1、和账户相关文件
/etc/passwd
保存用户账号的基本信息
[root@hahah ~]# cat /etc/passwd
...
hejin13:x:1022:1022::/home/hejin13:/bin/bash
sc:x:1023:1023::/home/sc:/bin/bash
- 字段1: 用户名
- 字段2: 密码占位符,通常为x或者*。
因为文件任何人都可以访问,密码不安全;
真正测密码放在/etc/shadow里面 - 字段3: 用户id
- 字段4: 所属基本组的id
- 字段5: 用户描述信息
- 字段6: 家目录位置
- 字段7: 登录的shell信息
练习
查找出linux系统里的用户uid大于2000的用户,显示出它的名字、uid、shell、家目录
[root@192 nginx]# cat /etc/passwd|awk -F : '$3>2000 {print $1,$3,$7,$6}'
nobody 65534 /sbin/nologin /
/etc/shadow
[root@192 ~]# cat /etc/shadow
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
...
hejin13:!!:18941:0:99999:7:::
sc:$6$wvTLEqS7sUZR.LcN$0EOiWoJy.QYcOGwepuQuqIIDvdeMf0ygmDJAPNxSZkapp9V9fLWN3/HKDVYs/jJi062YYNXDGbER1dfjwtkaE.:18946:0:99999:7:::
第2个字段:密码字段
*操作系统自带的,没有密码的
!!用户建的,没有密码的
提示: 密码字段为空说明密码被清除。
查看没有设置密码的用户
cat /etc/shadow|awk -F: 'BEGIN{i=0}length($2)<=2{print $1,"没有设置密码";i++}END{print "一共有"i"个用户"}'
[root@localhost ~]# diff /etc/passwd /etc/passwd-
47d46
< sc:x:1023:1023::/home/sc:/bin/bash
/etc/passwd- 和 /etc/shadow- 是/etc/passwd和/etc/shadow的备份文件,总比原文件少一次操作
2、组信息相关文件
/etc/group
[root@192 ~]# cat /etc/group
hejin13: x :1022:
sc : x: 1023:
/etc/gshadow
hejin13:!::
sc:!::
3、家目录信息相关文件
创建用户 默认在/home 创建同名的文件夹
/etc/skel/
用户环境默认设置文件
将 /etc/skel/ 下的文件拷贝到用户的家目录
[root@localhost skel]# ll -a
总用量 24
drwxr-xr-x. 2 root root 76 11月 15 11:31 .
drwxr-xr-x. 80 root root 8192 11月 15 11:31 ..
-rw-r--r--. 1 root root 0 11月 15 11:31 aa.txt
-rw-r--r--. 1 root root 18 7月 21 2020 .bash_logout
-rw-r--r--. 1 root root 141 7月 21 2020 .bash_profile
-rw-r--r--. 1 root root 376 7月 21 2020 .bashrc
/etc/login.defs
用户环境默认属性设置文件
–规定了uid从多少开始、密码过期的天数、密码的加密算法
- 0 root 超级用户
- 1~201 系统安装好就有的用户(系统用户、程序用户) :作用就是用来启动或登录某个程序
- 201~999 自己新建的系统用户 没有家目录,是管理系统的,不需要登录
- 1000~60000 自己新建的用户
超级用户root的UID为0
程序用户的UID1-999
普通用户的UID大于等于1000
/var/spool/mail
邮件目录
/var/spool/mail下面创建一个同名的文件
练习1:找uid大于1000的用户
找出系统中uid大于1000的用户 显示出名字、uid、家目录、shell信息
[root@localhost /]# awk -F: '$3>=1000{print $1,$3,$6,$7}' /etc/passwd
hejin12 1021 /home/hejin12 /bin/bash
hejin13 1022 /home/hejin13 /bin/bash
sc 1023 /home/sc /bin/bash
sc2 1024 /home/sc2 /bin/bash
>>> import os
>>> os.geteuid() 有效用户root用户有效的uid 为0
0
>>> os.getegid()
0
>>> os.getpid()
2264
>>> help(os.walk)
# 输出在文件夹中的文件名通过在树中游走,向上或者向下。
>>> list(os.walk("."))
[('.', [], ['passwd', 'access.log', 'config', 'ifcfg-ens33', 'hosts', 'test2.txt', 'path.txt', 'selinux', 'sshd_config', 't.txtr', 't.txt', '.test.txt.swp', 'test.txt'])]
练习2:验证用户是否存在
用python脚本验证用户是否存在,会用到sys模块和os模块
os.system(cmd)的返回值是脚本的退出状态码,只会有0(成功),1,2
os.popen(cmd)返回脚本执行的输出内容作为返回值
方式1
import sys
import os
username = sys.argv[1]
result = os.system(f"id {username}")
print(result)
if result == 0:
# if not result:
print("用户存在")
else:
print("用户不存在")
方式2
import sys
user1 = sys.argv[1]
with open("/etc/passwd") as f:
userList = []
for data in f:
data = data.strip()
lst = data.split(':')
userList.append(lst[0])
if user1 in userList: print("用户存在")
else:
print("用户不存在")
4、ftp协议(文件传输协议)
ftp是一个文件传输服务,主要用于上传和下载文件,实现共享文件。
vsftpd是“very secure TTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。
- 1、安装vsftp服务
yum install vsftpd -y
检查是否安装了vsftpd
rpm -qa|grep vsftpd - 2、安装客户端软件
yum install lftp ftp -y
lftp、ftp这两个都是ftp的客户端 - 3、启动服务
使用yum安装的服务基本上都可以使用systemctl启动;
systemctl start vsftpd
查看是否启动成功
ps aux|grep vsftpd - 4、编辑配置文件
vim /etc/vsftpd/vsftpd.conf
第12行,默认是NO,不允许匿名用户登录
centos8里vsftpd服务默认不允许匿名用户登录
anonymous_enable=NO 修改为YES
要重新加载配置文件,或者重启服务
systemctl restart vsftpd - 5、使用
[root@sanchuang-linux ~]# cat /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin # 注:vsftpd的匿名用户,公共用户
#注:/var/ftp ftp这个用户的家目录文件
[root@sanchuang-linux ~]# lftp ftp@192.168.0.27 # 注:以ftp用户取登录程序
密码: 注:ftp是默认用户
[root@kafka01 ~]# ftp 192.168.149.132
Connected to 192.168.149.132 (192.168.149.132).
220 (vsFTPd 3.0.3)
Name (192.168.149.132:root): ftp #系统中的程序用户ftp, 使用ftp匿名用户登陆
331 Please specify the password.
Password: #密码输入直接敲回车 一般是不会设置的
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
5、useradd 命令
格式:useradd [选项]… 用户名
常用选项
-u:指定 UID 标记号
-d:指定宿主目录,缺省为 /home/用户名
-e:指定帐号失效时间
-g:指定用户的基本组名(或GID号)
-G:指定用户的附加组名(或GID号)
-M:不为用户建立并初始化宿主目录
-s:指定用户的登录Shell
-c:用户注释描述信息 ,可以告诉别人创建改用户的目的
-r: 新建系统用户,不会有新建家目录
adduser username 默认不会创建家目录
统计当前/etc/passwd 中有几种shell信息
即用户一登上来执行什么操作
[root@localhost etc]# cat passwd | awk -F: '{print $7}'|sort -n|uniq -c
27 /bin/bash
1 /bin/sync
1 /sbin/halt
19 /sbin/nologin #ssh远程登录、su本地登录都不行
1 /sbin/shutdown
[root@localhost etc]# awk -F: '{print $7}' /etc/passwd |sort|uniq
/bin/bash #系统默认用户的shell信息
/bin/sync #将内存的缓存刷到磁盘
/sbin/halt #登录就关机
/sbin/nologin #用户不能登录系统
/sbin/shutdown #关机
useradd -s /sbin/nologin sc01 无论是ssh还是su都不能登录
useradd -s /sbin/halt sc02 登录即关机
找出系统中uid大于1000 并且shell信息为/bin/bash,用户名包含sanchuang的用户信息(用户名,用户id,家目录)
[root@localhost ~]# cat /etc/passwd | awk -F: '$3>1000{print $1,$3,$6,$7}'|grep /bin/bash|grep sangchuang
sangchuang03 1028 /home/sangchuang03 /bin/bash
sangchuang04 1029 /home/sangchuang04 /bin/bash
[root@localhost ~]# grep "sangchuang" /etc/passwd |grep /bin/bash |awk -F: '$3>1000{print $1,$3,$6}'
sangchuang03 1028 /home/sangchuang03
sangchuang04 1029 /home/sangchuang04
[root@localhost ~]# awk -F: '$3>1000 && $1~/sangchuang/ && $7=="/bin/bash" {print $1,$3,$6}' /etc/passwd
sangchuang03 1028 /home/sangchuang03
sangchuang04 1029 /home/sangchuang04
#指定家目录,但是受安全机制selinux限制
#selinux 一个linux内核的安全子系统,由于安全规则太繁琐,一般会将其关闭
[root@localhost ~]# useradd -d /tmp/sangchuang05 sangchuang05
useradd: cannot set SELinux context for home directory /tmp/sangchuang05
# 修改安全机制,重启系统生效配置
[root@localhost ~]# vim /etc/selinux/config
SELINUX=enforcing ——》SELINUX=disabled
# getenforce 查看是否生效
#指定组名
[root@localhost ~]# useradd -g sanchuang01 -G sangchuang04,sangchuang05 sangchuang07
[root@localhost ~]# id sangchuang07
uid=1031(sangchuang07) gid=1026(sanchuang01) 组=1026(sanchuang01),1029(sangchuang04),1030(sangchuang05)
6、userdel 命令
格式:userdel [-r] 用户名
添加 -r 选项时,表示连用户的宿主目录一并删除
添加 -f 选项时,表示强制删除
[root@localhost ~]# userdel sangchuang04 #删除用户帐号,而不删除相关文件。
userdel:组“sangchuang04”没有移除,因为它包含其它成员。
7、usermod 命令
格式:usermod [选项]… 用户名
常用选项
-u: 修改 UID
-d:指定宿主目录,缺省为 /home/用户名
-e:指定帐号失效时间
-g:指定用户的基本组名(或GID号)
-G:指定用户的附加组名(或GID号)
-s:指定用户的登录Shell
-l:更改用户帐号的登录名称
-L: 锁定用户账户
-U:解锁用户账户
[root@localhost ~]# usermod -u 1200 sc2 #修改UID
[root@localhost ~]# id sc2
uid=1200(sc2) gid=1024(sc2) 组=1024(sc2)
[root@localhost ~]# usermod -d /temp/ooo ooo #修改家目录
[root@localhost ~]# tail /etc/passwd
sc2:x:1200:1024::/home/sc2:/bin/bash
ooo:x:1025:1025::/temp/ooo:/bin/bash
[root@localhost ~]# usermod -g 1026 ooo #修改gid
[root@localhost ~]# id ooo
uid=1025(ooo) gid=1026(sanchuang01) 组=1026(sanchuang01)
[root@localhost ~]# usermod -G 1027 ooo #修改组id
[root@localhost ~]# id ooo
uid=1025(ooo) gid=1026(sanchuang01) 组=1026(sanchuang01),1027(snagchuang02)
[root@localhost ~]# usermod -c "修改注释" sanchuang11 #修改注释
[root@localhost ~]# tail /etc/passwd
...
sanchuang11:x:1033:1033:修改注释:/tmp/sanchuang11:/bin/bash
sanchuang12:x:1034:1034:描述信息:/home/sanchuang12:/bin/bash
账户锁定就是修改系统存储的密码字段,验证密码失败,达到账户锁定的目的
锁住的状态,其实就是在密码字段前面加一个!
[root@localhost ~]# usermod -L sangchuang07 锁定
[root@localhost ~]# usermod -U sangchuang07 解锁
8、passwd 命令
格式:passwd [选项]… 用户名
常用选项:
-d:清空用户的密码,使之无需密码即可登录
- l:锁定用户帐号
-u:解锁用户帐号
-S:查看用户帐号的状态(是否被锁定)
–stdin:接收别的命令stdout做为stdin标准输入设置 密码
root用户可以修改所有用户密码,不要求复杂性
普通用户只能修改自己的密码,有密码复杂度的要求
#使用标准输入来设置密码
[root@kafka01 lianxi]# echo 12345678 |passwd sanchuang13 --stdin
练习1
创建20个用户,用户名以beautwen开头,指定家目录在/tmp/lianxi/beautiwen01…20
登录shell 都指定为/usr/bin/sh
给出提示:创建之前判断,如果用户存在,就删除当前用户
练习2
9、groupadd
添加组
[root@localhost lianxi]# groupadd -g 5000 sanle
[root@localhost lianxi]# less /etc/group
sanle:x:5000:
10、 groupmems
对组成员进行修改,可以添加删除
groupmems -g 组名 -a 用户名 往这个组里面添加用户
groupmems -g 组名 -l 查看组里的用户
11、groupdel
[root@kafka01 lianxi]# groupdel sanle #删除sanle这个组
groupdel: cannot remove the primary group of user 'sanle1'#组里面有sanle1这个成员 所以删除不来
[root@kafka01 lianxi]# userdel -r sanle1 #先删除成员
[root@kafka01 lianxi]# groupdel sanle #再删除组
12、groupmod
[root@localhost lianxi]# groupadd -g 6000 sanchuang #添加用户指定GID
[root@localhost lianxi]# groupmod -g 4000 sanchuang #修改GID
[root@localhost lianxi]# groupmod -n sanchuang2 sanchuang #修改组名
[root@localhost lianxi]# tail -n 1 /etc/group
sanchuang2:x:4000:
13、newgrp修改有效组
用户必须是组成员才能改变有效组
有效组: 新建文件夹或文件的时候,属组是谁,谁就是有效组
[root@localhost lianxi]# id usersanle
uid=1329(usersanle) gid=1329(usersanle) 组=1329(usersanle),5000(sanle)
[usersanle@localhost ~]$ touch bb
[usersanle@localhost ~]$ ls -al
...
-rw-rw-r-- 1 usersanle usersanle 0 11月 17 10:51 bb
[usersanle@localhost ~]$ newgrp sanle
[usersanle@localhost ~]$ touch cc
[usersanle@localhost ~]$ ll
...
-rw-rw-r-- 1 usersanle usersanle 0 11月 17 10:51 bb
-rw-r--r-- 1 usersanle sanle 0 11月 17 10:55 cc
属主 属组
14、/etc/skel 文件
新建用户账号的时候,会复制到宿主目录
主要控制用户初始化环境配置
.bash_profile 用户每次登录时执行
.bashrc 用户退出登录的时候执行的
.bash_logout 用户每次进入新的bash环境执行
.bash_history 用户的历史命令。退出时会将历史命令写入这个文件
/etc/bashrc 在每个新的bash开启的时候执行
/etc/profile 在系统开启的时候执行
su - sanle:.bash_profile 和 .bashrc 都会被执行
su sanle :.bashrc 只会执行这个文件
#登陆的时候
.bash_profile --> ~/.bashrc --> /etc/bashrc
#进入新bash的时候
.bashrc --> /etc/bashrc
15、su命令
[root@localhost lianxi]# su - usersanle
#连同环境一起切到usersanle,家目录下的.bashrc .bash_profile都会执行
[root@localhost lianxi]# su usersanle
#只是切换了用户,环境变量没有切换,只会执行.bashrc
16、who/w命令
查看已经登录到主机的用户信息
[root@kafka01 ~]# w #显示的比who多俩行
14:43:32 up 1:19, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.149.1 11:10 2:35m 0.19s 0.19s -bash
root pts/1 192.168.149.1 11:16 3:27m 0.01s 0.01s -bash
root pts/2 192.168.149.1 14:42 1.00s 0.02s 0.01s w
USER | TTY | FROM | LOGIN@ | IDLE | JCPU | PCPU | WHAT |
---|---|---|---|---|---|---|---|
使用者 ID | 使用的终端机 | 从哪边连上来的 | 上线时间 | 呆滞时间 | CPU 使用量 | 动作 |
17、last/lastlog命令
last 显示用户最近登录信息
lastlog 查看所有用户上一次登录情况
18、audit 安全审计
系统安全
记录某个用户某些操作
记录某个程序某些操作
audit详解
回顾:
-
如何知道一个用户是否在linux系统里存在?
1、id 用户名 查看
2、查看/etc/passwd -
如何禁用一个用户登录linux系统?
1、passwd -l 用户名 锁定
2、usermod -L 用户名 锁定
3、useradd -s /sbin/nologin {username} 修改登录的shell -
如何知道一个用户属于哪些组?
1、groups uname
2、结合/etc/passwd和/etc/group查看
3、id uname -
如何知道哪些用户现在已经登录在linux里?
w、who -
哪些用户曾经 登录过linux系统?
last 显示用户最近登录信息
lastlog 查看所有用户上一次登录情况 -
如何给用户重新设置密码?
echo 密码|passwd sanchuang13 --stdin -
linux的root密码忘记了,怎么办?
进入单用户模式,修改root密码 -
如何将已经登录在系统里的用户踢出系统?
pkill -KILL -t pts/0 (pts/0为w指令看到的用户终端号)
ps aux | grep sshd 查看sshd进程PID
kill -9 10482 杀掉test登录的sshd进程PID -
并且防止它再次登录系统?
1.踢出可疑的root登录用户,马上修改密码
2.sshd—》/etc/hosts.deny hosts.allow —》ip
3./etc/ssh/sshd_config -->DenyUsers -->用户
4.把/bin/bash修改成/sbin/nologin