背景
Oracle安装的系统默认使用public key
的方式进行ssh登录验证,这种方式不可否认,很安全,但是在需要用到scp传输的时候,就显得不那么方便了。
因此,需要开启password认证,开启password认证之后,如果再使用默认的22端口,很容易遭受不断的扫描攻击;so,建议修改一个高范围端口号(如,12345)。
问题
在修改了默认端口号,从22修改到其它端口(如,12345)后,通过systemctl restart sshd
出现以下错误:
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.
通过systemctl status sshd
查看如下结果:
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2020-08-18 01:41:10 GMT; 5s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 24372 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=255)
Main PID: 24372 (code=exited, status=255)
Aug 18 01:41:10 instance-20200815-0027-notfree systemd[1]: Failed to start OpenSSH server daemon.
Aug 18 01:41:10 instance-20200815-0027-notfree systemd[1]: Unit sshd.service entered failed state.
Aug 18 01:41:10 instance-20200815-0027-notfree systemd[1]: sshd.service failed.
这个时候一定要注意,不要重启,否则可能服务器就连接不上了。
原因
报错原因是 SELinux(Security-Enhanced Linux) 所致。 SELinux 中文名为安全增强型 Linux, 是 Linux 内核的一个安全模块,提供了访问控制安全策略机制,SELinux 默认情况下限制了 ssh 的监听端口。
解决方案有两种:
- 关闭SELinux;
- 在SELinux中添加新的ssh监听端口
解决方案
关闭SELinux
可以通过getenforce
查看当前的状态,默认是Enforcing
(强制模式,违反SELinux规则的行为会被记录到日志中)。另外还有一种Permissive
(允许模式)。
如果只是临时使用,可以通过命令切换到允许模式:
# 切换到 Permissive 允许模式,1 为强制模式;
setenforce 0
但是这个操作,重启就会失效,另外一种永久生效的方法就是写入文件。
vi /etc/selinux/config
---
# 找到这一行:SELINUX=enforcing,修改为
SELINUX=disabled
保存即可。
通常,我们先通过命令切换,然后写入文件。这样就可以不用重启再生效。
SELinux中添加新的SSH端口
这种方法可以保留SELinux功能,同时解决修改ssh端口报错的问题。
使用命令semanage
,如果命令不存在,则安装
yum install policycoreutils-python -y
查看ssh默认绑定端口
semanage port -l | grep ssh
----
ssh_port_t tcp 22
添加新端口(以,12345为例)
# 注意名称是 ssh_port_t
semanage port -a -t ssh_port_t -p tcp 12345
验证下是否添加成功
semanage port -l | grep ssh
---
ssh_port_t tcp 12345, 22
- -l:查看记录
- -a:添加
- -m:修改
- -d:删除
- -t:添加类型
- -p:指定端口类型(tcp、udp
如果需要的安全性不是特别高,个人推荐第一种方案。