9月21日任务
3.7 su命令
3.8 sudo命令
3.9 限制root远程登录
对于Linux而言,权限的重要性毋庸置疑!对于普通用户而言无法执行那些只有root用户才能有效的命令,导致工作无法有效进行;
系统管理员又不能将root密码告知普通用户,因为容易导致管理的混乱,并可能造成部分严重后果。通过su命令和sudo命令可以有效的解决这些问题!
su命令
Linux系统是一个多用户的操作系统,常常需要切换不同用户以实现多个需求。su 命令就是实现用户切换登录的
(root用户切换其他用户不要密码,反过来需要密码)
基本使用
使用方法:su [-] USER
添加-参数时,在切换到USER身份登录的同时,会加载其配置文件、环境变量,并切换到用户家目录;
实用用法
如何在不切换用户的前提下,使用其他用户的身份执行命令
su - -c "command" USER
[root@localhost ~]# su - -c "touch /home/castiel/test.log; ls -l /home/castiel/test.log" castiel
-rw-rw-r--. 1 castiel castiel 0 ... /home/castiel/test.log
# 执行su命令后,当前用户还是root,并没有切换成castiel
[root@localhost ~]# whoami
root
特殊实例
使用su -命令切换用户,当该用户家目录不存在时,会切换用户登录,但不会切换工作目录,且提示符将为 -bash-4.2$
[root@localhost ~]# useradd -M user1
[root@localhost ~]# su - user1
su: 警告:无法更改到 /home/user1 目录: 没有那个文件或目录
-bash-4.2$ pwd
/root
-bash-4.2$ whoami
user1
通过手动创建家目录并拷贝模板配置文件/etc/skel/.bash*,实现用户完整切换
[root@localhost ~]# mkdir /home/user1
[root@localhost ~]# cp /etc/skel/.bash* /home/user1
[root@localhost ~]# chown -R user1.user1 /home/user1
[root@localhost ~]# ls -ld /home/user1
drwxr-xr-x. 2 user1 user1 62 ... /home/user1
# 验证切换
[root@localhost ~]# su - user1
上一次登录:一 ... CST 2017pts/0 上
[user1@localhost ~]$
系统模板文件 /etc/skel/.bash*
[root@centos7 ~]# ls -l /etc/skel/.bash*
-rw-r--r--. 1 root root 18 ... /etc/skel/.bash_logout
-rw-r--r--. 1 root root 193 ... /etc/skel/.bash_profile
-rw-r--r--. 1 root root 231 ... /etc/skel/.bashrc
sudo 命令
编辑sudo的配置文件最好使用visudo命令(会检测语法),不要直接去修改其配置文件 /etc/sudoers
其中修改的最核心的一行代码
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
# 在这行后新添加用户user1的sudo命令
user1 ALL=(ALL) /usr/bin/ls, /usr/bin/cat
3个ALL的含义:
-
第一个ALL:主机、ip
-
小括号内的ALL:user1将以什么用户身份执行
-
后面的ALL:可以执行的命令
后面的命令必须是绝对路径表示,否则容易出错,多个命令可以以逗号和一个空格连接
# 使用visudo命令,当编辑错误时会校验出来
[root@localhost ~]# visudo
visudo:>>> /etc/sudoers:syntax error 在行 92 附近<<<
现在做什么?
选项有:
重新编辑 sudoers 文件(e)
退出,不保存对 sudoers 文件的更改(x)
退出并将更改保存到 sudoers 文件(危险!)(Q)
# 输入e编辑修改
现在做什么?e
常规设置的规则,初次执行时需要输入用户user1的密码,短时间内再次执行不需要再次输入密码!
通过在command前加"NOPASSWD:",可以实现免密码执行。
user1 ALL=(ALL) NOPASSWD: /usr/bin/ls, /usr/bin/cat
需要注意的是:在执行sudo命令时提示输入的密码时执行sudo命令的当前用户的密码,而不是root等其他用户的密码!
sudo别名
-
主机别名
## Host Aliases
# 可以写ip,也可以也主机名
Host_Alias TESTSERVERS = 192.168.65.130, 192.168.65.133
# 配合核心代码使用
user1 TESTSERVERS=(ALL) ALL
- 用户别名
## User Aliases
User_Alias TESTS = user1, test
# 配合核心代码使用
TESTS ALL=(ALL) ALL
- 命令别名
## Command Aliases
Cmnd_Alias TEST = /usr/bin/ls, /usr/bin/cat
# 配合核心代码使用
user1 ALL=(ALL) TEST
- 组别名
## 允许wheel组内的用户执行任意命令;允许test组内的用户执行ls,cat命令
%wheel ALL=(ALL) ALL
%test ALL=(ALL) /usr/bin/ls, /usr/bin/cat
sudo命令参数
-
sudo -i
避免执行sudo时频繁输入密码。提示输入密码为当前账户的密码。没有时间限制。
执行后进入root账户,退回执行“exit”或“logout” 。
[user1@localhost ~]$ sudo -i
[sudo] password for user1:
[root@localhost ~]# whoami
root
-
sudo /bin/bash
会切换到root的bash下,但不能完全拥有root的所有环境变量,可以拥有root用户的权限。这个命令等同于sudo -s。
[user1@localhost ~]$ sudo /bin/bash
[sudo] password for user1:
[root@localhost user1]# whoami
root
- sudo -s : 如上
[user1@localhost ~]$ sudo -s
[sudo] password for user1:
[root@localhost user1]# whoami
root
[root@localhost user1]# pwd
/home/user1
-
sudo su
登录到root,但并未切换到root的环境变量。
[user1@localhost ~]$ sudo su
[sudo] password for user1:
[root@localhost user1]# whoami
root
[root@localhost user1]# pwd
/home/user1
-
sudo su -
切换为root,可以使用root环境变量。等价于先切换为root,再执行su -命令。
[user1@localhost ~]$ sudo su -
[sudo] password for user1:
上一次登录:二 ... CST ...从 192.168.65.1pts/1 上
[root@localhost ~]# whoami
root
[root@localhost ~]# pwd
/root
实用小技巧
不通过密码登录root账户
不知道root用户密码,无法登录root,但是可以通过登录普通用户user
-
在visudo内编辑user用户执行su命令时不需要密码
user ALL=(ALL) NOPASSWD: /bin/su
-
在普通用户下执行 sudo su - root,这样就可以登录到root了
限制root远程登录
-
编辑/etc/sshd/sshd_config文件
-
找到"#PermitRootLogin yes"这一行(我的文件时第49行)
-
修改为 “PermitRootLogin no”,保存后退出
-
重启sshd服务
[root@localhost ~]# systemctl restart sshd.service
这里需要注意的是配置文件是sshd_config,而非ssh_config!
限制了root远程登录,可以通过登录普通用户,再结合su命令来执行部分root权限。以此实现root用户权限的合理使用。