任务内容:
3.1 用户配置文件和密码配置文件
3.2 用户组管理
3.3 用户管理
3.4 usermod命令
3.5 用户密码管理
3.6 mkpasswd命令
3.7 su命令
3.8 sudo命令
3.9 限制root远程登录
扩展
sudo与su比较 http://www.apelearn.com/bbs/thread-7467-1-1.html
sudo配置文件样例 www.opensource.apple.com/source/sudo/sudo-16/sudo/sample.sudoers
sudo不错的教程 http://www.jianshu.com/p/51338e41abb7
sudo -i 也可以登录到root吗? http://www.apelearn.com/bbs/thread-6899-1-1.html
用户配置文件和密码配置文件
/etc/passwd是用户配置文件,也可以说是核心的配置文件。没创建一个用户,该文件底部会多一行。
[root@localhost ~]# ls /etc/passwd
/etc/passwd
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...........................................................
zsy:x:1000:1000::/home/zsy:/bin/bash
每个用户一行,由:分割为7段。
第一段:用户名
第二段:x,早期用于保存用户密码
第三段:UID
第四段:GID
第五段:用户的注释信息,无实际作用
第六段:用户的家目录
第七段:用户的shell。(shell相当于和机器交互的一个窗口,xhsell能连上,就相当于获得了一个窗口)
/etc/shadow是密码配置文件,专门用于存放用户密码的文件,每一行的用户名都和passwd文件一一对应。
[root@localhost ~]# cat /etc/shadow
root:$6$0fPUR0uyAy8kxgyd$cIGQDzajXWcVr9gqqG/ndxurnWAHxJk11qklLisyQtMGHCgDtj/8ReFzccNIe/eqwp0.45VVwWWIN648REBDS/::0:99999:7:::
bin:*:17632:0:99999:7:::
............................................
zsy:!!:17742:0:99999:7:::
第一段:用户名
第二段:加密后的密码
第三段:距离1970年1月1日更改密码隔了多少天数
第四段:过多少天才可以更改密码
第五段:密码多少天后到期,即多少天后必须更改密码
第六段:提示密码在几天后到期
第七段:密码到期后多少天内不修改密码,账户将被禁用。
第八段:距离1970年1月1日多少天,账户将被禁用。
第九段:保留字段,留作将来用。
密码都是经过加密的,只能通过明文获得加密后的字符串,不可以通过字符串反向解密。
我们可以将用户zsy和用户root设置相同的密码。
[root@localhost ~]# passwd zsy
更改用户 zsy 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
然后在一行里执行两个命令,分别查看root和zsy的密码,可以使用分号 ; 进行分割。
[root@localhost ~]# head -n1 /etc/shadow ; tail -n1 /etc/shadow
root:$6$0fPUR0uyAy8kxgyd$cIGQDzajXWcVr9gqqG/ndxurnWAHxJk11qklLisyQtMGHCgDtj/8ReFzccNIe/eqwp0.45VVwWWIN648REBDS/::0:99999:7:::
zsy:$6$iexh5WoZ$HtXuK48/z.Ldqg9rgaJt9xADjmX/ClhaFd9yHx8/bLqQcAP8lsntaDTsbSAL9G/GxEUj5g2pEgRNR5DHT40m41:17742:0:99999:7:::
由此可见虽然root和zsy的明文密码一致,但是加密后的密码并不相同。
不过可以将所有可能的明文密码都进行加密,获得一个一一对应的数据库。
用户组管理
/etc/group是用户组的配置文件,我们在创建用户的时候,系统会自动创建一个和用户名一样的组。
[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:
...................
zsy:x:1000:
/etc/gshadow是组密码配置文件
[root@localhost ~]# cat /etc/gshadow
root:::
bin:::
.........
zsy:!::
增加组,-g 可以指定组id ,默认从1000开始
[root@localhost ~]# groupadd grp1
[root@localhost ~]# tail -n1 /etc/group
grp1:x:1001:
[root@localhost ~]# groupadd -g 1005 grp2
[root@localhost ~]# tail -n3 /etc/group
zsy:x:1000:
grp1:x:1001:
grp2:x:1005:
删除组,如果组中有成员,则不可以删除。
[root@localhost ~]# groupdel grp1
[root@localhost ~]# tail -n3 /etc/group
chrony:x:996:
zsy:x:1000:
grp2:x:1005:
用户管理
useradd 创建用户 与adduser作用一样
创建一个用户,uid从1000开始。
[root@localhost ~]# useradd user2
[root@localhost ~]# tail -n2 /etc/passwd
zsy:x:1000:1000::/home/zsy:/bin/bash
user2:x:1001:1001::/home/user2:/bin/bash
可以指定uid(u),gid(g),家目录(d)和shell(s)
[root@localhost ~]# useradd -u 1006 -g grp2 -d /home/zsy111 -s /sbin/nologin user4
[root@localhost ~]# tail -n3 /etc/passwd
user2:x:1001:1001::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/zsy111:/sbin/nologin
还可以创建用户的时候,不创建家目录。可以在/home下看到没有user5的家目录。其实是有家目录的,只是没创建。
[root@localhost ~]# useradd -M user5
[root@localhost ~]# tail -n3 /etc/passwd
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/zsy111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
[root@localhost ~]# ls /home
user2 user3 zsy zsy111
userdel删除用户
使用此命令删除user8,默认是不删除user8的家目录的。
[root@localhost ~]# userdel user8
[root@localhost ~]# tail -n3 /etc/passwd
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/zsy111:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
[root@localhost ~]# ls /home/
user2 user3 user8 zsy zsy111
那么能不能在删除用户的时候 ,一起删掉它的家目录呢?答案是可以的。使用-r参数可以做到。
[root@localhost ~]# userdel -r user4
[root@localhost ~]# tail -n3 /etc/passwd
zsy:x:1000:1000::/home/zsy:/bin/bash
user2:x:1001:1001::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
[root@localhost ~]# ls /home
user2 user3 user8 zsy
usermod
usermod可以更改用户属性,usermod -参数 username
-u:更改用户的uid;
-g: 更改用户的gid或组名;该gid必须存在,才能使用
-d: 更改用户的家目录;
-s: 更改用户的shell;
-G:添加扩展组;把用户追加到某些组里,可以追加到多个组中,每个组之间用“,”隔开
比如把user3的uid从1004改为1006
[root@localhost ~]# tail -n3 /etc/passwd
zsy:x:1000:1000::/home/zsy:/bin/bash
user2:x:1001:1001::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
[root@localhost ~]# usermod -u 1006 user3
[root@localhost ~]# tail -n3 /etc/passwd
zsy:x:1000:1000::/home/zsy:/bin/bash
user2:x:1001:1001::/home/user2:/bin/bash
user3:x:1006:1005::/home/user3:/bin/bash
将user4追加到grp3,grp4组中,用id user4查看user4的id属性
[root@localhost ~]# usermod -G grp3,grp4 user4
[root@localhost ~]# id user4
uid=1007(user4) gid=1008(user4) 组=1008(user4),1006(grp3),1007(grp4)
passwd 更改用户密码,这个命令具有set_uid权限。格式 passwd -参数 -username
比如更改root用户的密码
[root@localhost ~]# passwd root
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
第二位两个叹号!!,代表用户的密码为空
第二位*,代表用户的密码被锁定的
-l参数 锁定用户密码(lock)
新建一个user6用户,并更改其密码,查看shadow文件。然后使用passwd -l命令,再查看shadow文件。发现第二项密码的前面多了两个叹号!! 说明此用户的密码被锁定了
[root@localhost ~]# useradd user6
[root@localhost ~]# passwd user6
更改用户 user6 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# tail -n1 /etc/shadow
user6:$6$3Z6EnthK$YVqfilOLIa65A6tyFltLi1R.yNfjdSspPrH3o.3JJgTXc8VG6Y2eJdY.FrJFpKP5qFu7o/FtQVMzTetcHA0rq.:17742:0:99999:7:::
[root@localhost ~]# passwd -l user6
锁定用户 user6 的密码 。
passwd: 操作成功
[root@localhost ~]# tail -n1 /etc/shadow
user6:!!$6$3Z6EnthK$YVqfilOLIa65A6tyFltLi1R.yNfjdSspPrH3o.3JJgTXc8VG6Y2eJdY.FrJFpKP5qFu7o/FtQVMzTetcHA0rq.:17742:0:99999:7:::
-u 解锁用户密码(ulock)
现在解锁user6用户,再查看他的shadow文件,发现第二项密码前面的两个叹号已经没有了。
[root@localhost ~]# passwd -u user6
解锁用户 user6 的密码。
passwd: 操作成功
[root@localhost ~]# tail -n1 /etc/shadow
user6:$6$3Z6EnthK$YVqfilOLIa65A6tyFltLi1R.yNfjdSspPrH3o.3JJgTXc8VG6Y2eJdY.FrJFpKP5qFu7o/FtQVMzTetcHA0rq.:17742:0:99999:7:::
其实使用usermod命令也能锁定用户密码,和解锁用户密码。
usermod -L username 锁定用户密码(第二项密码前面有一个感叹号!,一个感叹号和两个感叹号效果一样)
usermod -U username 解锁用户密码
使用passwd --stdin username 可以只输入一次密码,并明文显示
[root@localhost ~]# passwd --stdin user6
更改用户 user6 的密码 。
123
passwd:所有的身份验证令牌已经成功更新。
echo ''123456" |passwd --stdin user6可以直接将user6的密码改为123456,无需输入。(|是管道符,将前方的结果传递给后方)
[root@localhost ~]# echo "123456"|passwd --stdin user6
更改用户 user6 的密码 。
passwd:所有的身份验证令牌已经成功更新。
echo -e "123\nsss" 允许内容换行\n 或者tab隔开\t
[root@localhost ~]# echo -e "123\nsss"
123
sss
[root@localhost ~]# echo -e "123\tsss"
123 sss
如果passwd后不加 --stdin参数,那么密码就得输入两次的问题,不过可以使用echo命令实现只输一次密码。
[root@localhost ~]# echo -e "123\n123" | passwd user6
更改用户 user6 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
密码设置规则:长度最好超过10位,包含大小写字母、数字,甚至特殊字符。最好不要有规律性。
mkpasswd
即 make passwd ,用于生成密码。在使用此命令之前,需要安装工具。
yum install -y expect
安装完成后,我们查看一下使用效果
[root@localhost ~]# mkpasswd
2lB1zl\De
-l 12 指定长度为12位
-s 3 指定包含3个特殊符号
su命令
主要作用是切换用户
su - 的作用是彻底切换用户
su 的作用也是切换用户,但是切换的不彻底
例如目前root用户在/root目录下,使用su - user1命令后,用户在/home/user1下;如果使用su usre1命令,用户还是在/root目录下。
[root@localhost ~]# su - user1
[user1@localhost ~]$ pwd
/home/user1
[root@localhost ~]# su user1
[user1@localhost root]$ pwd
/root
以user9用户的身份执行一条命令,但是不切换到user1用户下
[root@localhost ~]# su - -c "touch /tmp/1.txt" user9
[root@localhost ~]# ll -h /tmp/1.txt
-rw-rw-r--. 1 user9 user9 0 7月 30 22:24 /tmp/1.txt
在user9用户下,切换到user10。
[user9@localhost ~]$ su - user10
密码:
最后一次失败的登录:一 7月 30 22:26:01 CST 2018pts/1 上
最有一次成功登录后有 1 次失败的登录尝试。
系统存在模板目录 在/etc/skel下
[user10@localhost ~]$ ls -la /etc/skel
总用量 24
drwxr-xr-x. 2 root root 62 4月 11 12:59 .
drwxr-xr-x. 74 root root 8192 7月 30 22:26 ..
-rw-r--r--. 1 root root 18 4月 11 08:53 .bash_logout
-rw-r--r--. 1 root root 193 4月 11 08:53 .bash_profile
-rw-r--r--. 1 root root 231 4月 11 08:53 .bashrc
如果一个家目录下没有配置文件,可以把以上配置文件拷贝到家目录下,并更改权限
cp /etc/skel/.bash* /home/user5/
chown -R user5:user5 /home/user5/ (-R级联处理,处理指定目录以及其子目录下的所有文件)
普通用户显示$ ,root用户显示#
[user10@localhost ~]$
[root@localhost ~]#
sudo
让普通用户以root的身份临时执行一条命令
可以用visudo命令,查看sudo的配置文件,这个命令可以检测语法错误。:wq保存退出,这里和vi一样。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
user9 ALL=(ALL) ls,mv,cat
## Allows members of the 'sys' group to run networking, software,
第一个ALL表示在哪里 ,(ALL)表示所有用户,后面一个ALL表示所有命令。
保存退出后系统提示93行有错误
[root@localhost ~]# visudo
>>> /etc/sudoers: 语法错误 near line 93 <<<
现在做什么?
选项有:
重新编辑 sudoers 文件(e)
退出,不保存对 sudoers 文件的更改(x)
退出并将更改保存到 sudoers 文件(危险!)(Q)
现在做什么?
我们按e重新编辑。
使用:set nu显示行号,找到93行。命令应该使用绝对路径,并且逗号后有一个空格
93 user9 ALL=(ALL) /usr/bin/ls, /usr/bin/mv, /usr/bin/cat
在user9用户下,使用sodu命令查看 /root/目录下有哪些文件
[user9@localhost ~]$ sudo /usr/bin/ls /root/
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] user9 的密码:
anaconda-ks.cfg
比如使用user9查看/root/anaconda-ks.cfg,会提示没权限。用sudo命令就可以了。
[user9@localhost ~]$ cat /root/anaconda-ks.cfg
cat: /root/anaconda-ks.cfg: 权限不够
[user9@localhost ~]$ sudo cat /root/anaconda-ks.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
................................................
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
接下来我们在visudo中,再添加一行
user10 ALL=(ALL) NOPASSWD: /usr/bin/ls, /usr/bin/cat
NOPASSWD表示切换的时候不需要密码。
[user10@localhost ~]$ ls /root/
ls: 无法打开目录/root/: 权限不够
[user10@localhost ~]$ sudo ls /root
anaconda-ks.cfg
Host User Cmnd都可以做Alias
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2
# User_Alias ADMINS = jsmith, mikem
Cmnd_Alias ZSY_CMD= /usr/bin/ls, /usr/bin/mv, /usr/bin/cat
可以将原来93行的/usr/bin/ls, /usr/bin/mv, /usr/bin/cat 直接用ZSY_CMD代替,即
/usr/bin/ls, /usr/bin/mv, /usr/bin/cat
现在切换到user9下,使用sudo命令查看/root下的文件,成功!
[root@localhost ~]# su - user9
上一次登录:一 7月 30 22:51:12 CST 2018pts/1 上
[user9@localhost ~]$ sudo ls /root/
[sudo] user9 的密码:
anaconda-ks.cfg
93行前面的用户,也可以使用用户组代替。
限制root远程登录
修改visudo,做一个User_Alias
User_Alias ZSYS = zsy, user9, user10
然后让ZSYS这个用户组切换到root的时候不需要密码执行su命令
ZSYS ALL=(ALL) NOPASSWD: /usr/bin/su
在user9下执行sudo命令,发现无需密码。
[user9@localhost ~]$ sudo su
[root@localhost user9]#
那么如何限制root登录呢?
[root@localhost ~]# vi /etc/ssh/sshd_config
首先去除#,将PermitRootLogin no 后面的yes改成no。:wq保存退出,重启sshd服务
[root@localhost ~]# systemctl restart sshd.service
然后使用xshell重新使用root登录系统,发现无法登录。即使提示输入密码,也无法登录。