linux禁用root
- 1. 禁止普通用户切换到root
- 1.1 sudo -i和sudo -s的区别
- 1.2 sudo -i和直接登录root账号的区别
- 1.3 禁止sudo -i切换root
- 1.4 禁止su - root切换root
- 2. 禁止root远程登录
- 2.1 ssh禁止root登录
- 2.2 禁止远程桌面登录
本文主要介绍:
- 如何禁止普通用户切换到root
- 如何禁止使用root远程登录
1. 禁止普通用户切换到root
普通用户可以通过两个命令切换到root
,包括:
sudo -i
su - xxx
以及一个伪切换sudo -s
1.1 sudo -i和sudo -s的区别
sudo -i
:这个命令会加载用户的.profile
,.bash_profile
或.login
文件,并切换到目标用户的home目录,通常是root用户的目录。这允许用户以root用户的完整环境运行命令,包括所有的环境变量和配置。因此,当使用sudo -i
时,用户会获得一个类似于登录root用户的环境,包括root的环境变量。
yurq@yurq:~$ sudo -i
root@yurq:~# env
SHELL=/bin/bash
SUDO_GID=1000
LANGUAGE=zh_CN:zh
JAVA_HOME=/home/hadoop/workspace/jdk-8u202-linux-x64/jdk1.8.0_202
JRE_HOME=/home/hadoop/workspace/jdk-8u202-linux-x64/jdk1.8.0_202/lib
SUDO_COMMAND=/bin/bash
SUDO_USER=yurq
PDSH_RCMD_TYPE=ssh
PWD=/root
LOGNAME=root
HOME=/root
LANG=zh_CN.UTF-8
HADOOP_USER_NAME=hadoop
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm
HADOOP_HOME=/home/hadoop/workspace/hadoop-2.7.7
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
ZOOKEEPER_HOME=/home/hadoop/workspace/apache-zookeeper-3.7.1-bin
DISPLAY=localhost:10.0
SHLVL=1
SPARK_HOME=/home/hadoop/workspace/spark-2.4.8-bin-hadoop2.7
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/hadoop/workspace/jdk-8u202-linux-x64/jdk1.8.0_202/bin:/home/hadoop/workspace/hadoop-2.7.7/bin:/home/hadoop/workspace/hadoop-2.7.7/sbin:/home/hadoop/workspace/apache-zookeeper-3.7.1-bin/bin:/home/hadoop/workspace/spark-2.4.8-bin-hadoop2.7/bin:/home/hadoop/workspace/spark-2.4.8-bin-hadoop2.7/sbin
SUDO_UID=1000
MAIL=/var/mail/root
_=/usr/bin/env
root@yurq:/home/yurq# id
用户id=0(root) 组id=0(root) 组=0(root)
sudo -s
:这个命令不会加载用户的配置文件,也不会切换到目标用户的home目录。它只是提供一个没有加载用户特定配置的root shell
。这意味着,虽然用户可以在这个shell中执行命令,但不会享受到完整的root环境,例如不会加载root的环境变量。这通常会带来一些问题,比如xjjdog用户下设置了自己的一套环境变量,当使用 su -s 切换到超级管理员权限,依然使用的是xjjdog的环境变量。这样,就会发生找不到命令,语言错误,甚至配置错误的结果。
yurq@yurq:~$ sudo -s
root@yurq:/home/yurq# env
SHELL=/bin/bash
SUDO_GID=1000
LANGUAGE=zh_CN:zh
SUDO_COMMAND=/bin/bash
SUDO_USER=yurq
PWD=/home/yurq
LOGNAME=root
HOME=/root
LANG=zh_CN.UTF-8
...
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
DISPLAY=localhost:10.0
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
SUDO_UID=1000
MAIL=/var/mail/root
_=/usr/bin/env
root@yurq:/home/yurq# id
用户id=0(root) 组id=0(root) 组=0(root)
1.2 sudo -i和直接登录root账号的区别
直接登录root
:意味着用户完全切换到了root的身份和环境,拥有对系统的完全控制权。这种做法通常只在必要时才应该进行,因为它可能会带来安全风险,因为任何在root用户环境下进行的操作都可能对系统造成不可逆的影响。
使用sudo -i相比直接登录为root,提供了更高的安全性。因为即使是以root权限运行命令,用户也仍然在自己的用户环境中,这减少了误操作或恶意软件对系统的潜在损害。此外,sudo命令的使用记录会被详细记录在日志中,这对于追踪潜在的安全威胁或系统故障非常有用
root@yurq:~# env
SHELL=/bin/bash
LANGUAGE=zh_CN:zh
JAVA_HOME=/home/hadoop/workspace/jdk-8u202-linux-x64/jdk1.8.0_202
JRE_HOME=/home/hadoop/workspace/jdk-8u202-linux-x64/jdk1.8.0_202/lib
PDSH_RCMD_TYPE=ssh
PWD=/root
LOGNAME=root
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/root
LANG=zh_CN.UTF-8
HADOOP_USER_NAME=hadoop
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
TERM=xterm
HADOOP_HOME=/home/hadoop/workspace/hadoop-2.7.7
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
ZOOKEEPER_HOME=/home/hadoop/workspace/apache-zookeeper-3.7.1-bin
DISPLAY=localhost:10.0
SHLVL=1
SPARK_HOME=/home/hadoop/workspace/spark-2.4.8-bin-hadoop2.7
XDG_SESSION_ID=15
XDG_RUNTIME_DIR=/run/user/0
SSH_CLIENT=192.168.79.1 61751 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/hadoop/workspace/jdk-8u202-linux-x64/jdk1.8.0_202/bin:/home/hadoop/workspace/hadoop-2.7.7/bin:/home/hadoop/workspace/hadoop-2.7.7/sbin:/home/hadoop/workspace/apache-zookeeper-3.7.1-bin/bin:/home/hadoop/workspace/spark-2.4.8-bin-hadoop2.7/bin:/home/hadoop/workspace/spark-2.4.8-bin-hadoop2.7/sbin
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
SSH_TTY=/dev/pts/0
_=/usr/bin/env
1.3 禁止sudo -i切换root
sudo
命令的配置文件是/etc/sudoers
和/etc/sudoers.d/
,可以在/etc/sudoers.d
目录中单独配置用户的sudo
命令限制,类似vsftp
单独配置每个账号
ubuntu默认普通用户是无法切换root
的
lvdd@yurq:~$ sudo -i
[sudo] lvdd 的密码:
lvdd 不在 sudoers 文件中。此事将被报告。
我们可以通过修改/etc/sudoers
或/etc/sudoers.d/
进行配置,但是一般来说不能通过vim
直接修改,因为默认无权限,即使是root
root@yurq:~# ll /etc/sudoers
-r--r----- 1 root root 917 7月 24 11:39 /etc/sudoers
这里linux给我们提供了visudo
命令,专门用于修改这个文件,不过虽然看起来像是vi
命令,实际上是nano
编辑器进行修改的。新增内容如下
root@yurq:~# grep lvdd /etc/sudoers
lvdd ALL=(ALL:ALL) ALL
关于/etc/sudoers
的编写格式,网上有很多讲解,这里不展开了
lvdd@yurq:~$ sudo -i
[sudo] lvdd 的密码:
root@yurq:~#
sudo -i
切换root
需要输入当前用户的密码。改完了直接就生效了。
ubuntu如果禁止sudo -i
可以切换用户,那么就要看看这个配置文件是否对普通用户进行了特殊配置。
这里我们改回去,在/etc/sudoers.d
目录中配置用户信息
root@yurq:~# grep lvdd /etc/sudoers
#lvdd ALL=(ALL:ALL) ALL
#切换终端
lvdd@yurq:~$ sudo -i
lvdd 不在 sudoers 文件中。此事将被报告。
新增配置文件lvdd
root@yurq:/etc/sudoers.d# cat lvdd
lvdd ALL=(ALL:ALL) ALL
#切换终端
lvdd@yurq:~$ sudo -i
root@yurq:~#
又可以切换了。
1.4 禁止su - root切换root
lvdd@yurq:~$ su - root
密码:
root@yurq:~#
前面提到sudo -
切换root
需要输入当前用户的密码,使用su -
切换root
需要输入root
密码。这个看起来像一个伪命题,因为我们都知道root
密码了,还切换干嘛,不如直接登录了。实际上后面将提到,通过ssh登录,即使知道root
密码,也可以禁止登录。毕竟大多数时候,我们都接触不到物理机。这里我们只研究可行性,暂时不讨论合理性。
这里简单介绍以下su
命令带不带参的区别
su
:这个命令允许用户切换到其他用户,但它不会加载目标用户的环境变量。这意味着,当你使用su命令切换到另一个用户时,你实际上是在当前用户的环境中运行目标用户的shell,而不是在目标用户的环境中运行。su -
:这个命令允许用户切换到另一个用户,并且会加载目标用户的环境变量。当你使用su -命令切换到另一个用户时,你会在目标用户的环境中运行,这意味着你会获得该用户所有的环境变量和配置。su -c
:这个命令允许你在切换到另一个用户的同时执行一个命令,然后立即返回到原始用户。这意味着你可以以其他用户的身份运行一个命令,而不需要实际切换到那个用户。例如,如果你想要以root用户的身份运行一个命令,但不想切换到root用户,你可以使用su -c 'command'
的形式来执行。
lvdd@yurq:~$ su -c "tail -1 /etc/passwd" root
密码:
lvdd:x:1001:1007::/home/lvdd:/bin/bash
这里有多种方法禁止su
切换到root
,基本上大同小异,笔者列举两种方法:
方法一 修改su
的权限
root@yurq:/etc/sudoers.d# ll /bin/su
-rwsr-xr-x 1 root root 67816 4月 9 23:34 /bin/su*
root@yurq:/etc/sudoers.d# chmod 750 /bin/su
root@yurq:/etc/sudoers.d# ll /bin/su
-rwxr-x--- 1 root root 67816 4月 9 23:34 /bin/su*
lvdd@yurq:~$ su - root
-bash: /usr/bin/su: 权限不够
lvdd@yurq:~$ su - yurq
-bash: /usr/bin/su: 权限不够
这样可以仅允许root用户和所属组的用户使用su命令,其他用户将无法使用。改回原来的权限
root@yurq:/etc/sudoers.d# chmod 4755 /bin/su
root@yurq:/etc/sudoers.d# ll /bin/su
-rwsr-xr-x 1 root root 67816 4月 9 23:34 /bin/su*
方法二 修改认证条件
root@yurq:/etc/sudoers.d# grep auth /etc/pam.d/su
auth sufficient pam_rootok.so debug
auth required pam_wheel.so group=wheel
这样设置后,只有wheel组的成员才能使用su -命令切换到root用户。
lvdd@yurq:~$ su - root
密码:
su: 认证失败
添加组及修改用户附加组
root@yurq:/etc/sudoers.d# groupadd wheel
root@yurq:/etc/sudoers.d# usermod -G wheel lvdd
lvdd@yurq:~$ su - root
密码:
root@yurq:~#
lvdd又可以愉快的切换root
了。
到这里ubuntu系统就可以禁止或允许普通用户通过su
进行切换root
了,不过有的系统可能还需要作如下修改
修改
/etc/login.defs
文件,在文件末添加一行SU_WHEEL_ONLY yes
,这样配置后,非wheel组的用户即使输入了正确的密码,也无法通过su -
命令切换到root用户。
这里关于认证模块,可以参考linux PAM模块简介
2. 禁止root远程登录
前面说到了知道root
密码,还使用普通用户切换root
干什么?直接登录不好么。其实有些情况下,即使知道root
密码也不可以通过远程登录。这里包括通过ssh进行命令行登录和远程桌面登录,下面我们分别进行说明
2.1 ssh禁止root登录
我们通过修改ssh
的配置文件/etc/ssh/sshd_config
,禁止root
登录
root@yurq:/etc/sudoers.d# grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin prohibit-password
可以看到ubuntu默认是禁止root使用密码登录的。
PermitRootLogin
Specifies whether root can log in using ssh(1). The argument must be yes, prohibit-password, forced-commands-only, or no. The default is
prohibit-password.
查看帮助,可以知道PermitRootLogin
选项的值包括:
参数类别 | 是否允许ssh登陆 | 登录方式 | 交互shell |
---|---|---|---|
yes | 允许 | 没有限制 | 没有限制 |
prohibit-password (without-password) | 允许 | 除密码以外 | 没有限制 |
forced-commands-only | 允许 | 仅允许使用密钥 | 仅允许已授权的命令 |
no | 不允许 | N/A | N/A |
改成yes
就可以登录了
root@yurq:/etc/sudoers.d# grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin yes
ssh配置文件简介,这篇文章很详细的介绍了sshd_config
2.2 禁止远程桌面登录
ubuntu系统root默认是无法远程桌面的,所以要禁止,先开启
- 修改文件
/usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf
文件,增加两行:
sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
greeter-show-manual-login=true
all-guest=false
- 进入
/etc/pam.d
目录,修改gdm-autologin和gdm-password文件
vi gdm-autologin
#注释掉auth required pam_succeed_if.so user != root quiet_success这一行,保存
vi gdm-password
#注释掉 auth required pam_succeed_if.so user != root quiet_success这一行,保存
- 修改
/root/.profile
文件
sudo vi /root/.profile
#将文件末尾的mesg n || true这一行修改成tty -s&&mesg n || true, 保存
- 重启系统,输入root用户名和密码,登录系统。
- root自动登录
vim /etc/gdm3/custom.conf
#将[daemon]
AutomaticLoginEnable=True
AutomaticLogin=root
#设置为root用户自动登录
可以根据以上配置,对已开启允许root的远程桌面的系统进行限制。当然不同的系统,不同的桌面系统配置可能不同,此处仅以ubuntu的gnome桌面为例进行说明。