以CentOS为例总结如何配置SSH安全访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以CentOS为例总结如何配置SSH安全访问相关的知识,希望对你有一定的参考价值。

而为了节省成本或提高性能,不少人的独机和 VPS,都是基于 unmanaged 的裸机,一切都要自己 DIY。这时候,安全策略的实施,就犹为重要。下面这篇文章,我以 CentOS 为例,简单地总结一下如何配置 SSH 安全访问。 Linux SSH 安全策略一:关闭无关端口 网络上被攻陷的大多数主机,是黑客用扫描工具大范围进行扫描而被瞄准上的。所以,为了避免被扫描到,除了必要的端口,例如 Web、FTP、SSH 等,其他的都应关闭。值得一提的是,我强烈建议关闭 icmp 端口,并设置规则,丢弃 icmp 包。这样别人 Ping 不到你的服务器,威胁就自然减小大半了。丢弃 icmp 包可在 iptables 中, 加入下面这样一条: -A INPUT -p icmp -j DROP Linux SSH 安全策略二:更改 SSH 端口 默认的 SSH 端口是 22。强烈建议改成 10000 以上。这样别人扫描到端口的机率也大大下降。修改方法: # 编辑 /etc/ssh/ssh_config vi /etc/ssh/ssh_config # 在 Host * 下 ,加入新的 Port 值。以 18439 为例(下同): Port 22 Port 18439 # 编辑 /etc/ssh/sshd_config vi /etc/ssh/sshd_config #加入新的 Port 值 Port 22 Port 18439 # 保存后,重启 SSH 服务: service sshd restart 这里我设置了两个端口,主要是为了防止修改出错导致 SSH 再也登不上。更改你的 SSH 客户端(例如:Putty)的连接端口,测试连接,如果新端口能连接成功,则再编辑上面两个文件,删除 Port 22 的配置。如果连接失败,而用 Port 22 连接后再重新配置。 端口设置成功后,注意同时应该从 iptables 中, 删除22端口,添加新配置的 18439,并重启 iptables。 如果SSH 登录密码是弱密码,应该设置一个复杂的密码。Google Blog 上有一篇强调密码安全的文章:Does your password pass the test? Linux SSH 安全策略三:限制 IP 登录 如果你能以固定 IP 方式连接你的服务器,那么,你可以设置只允许某个特定的 IP 登录服务器。例如我是通过自己的 VPN 登录到服务器。设置如下: # 编辑 /etc/hosts.allowvi /etc/hosts.allow# 例如只允许 123.45.67.89 登录sshd:123.45.67.89 Linux SSH 安全策略四: 使用证书登录 SSH 相对于使用密码登录来说,使用证书更为安全。自来水冲咖啡有写过一篇详细的教程,征得其同意,转载如下: 为CentOS配置SSH证书登录验证 帮公司网管远程检测一下邮件服务器,一台CentOS 5.1,使用OpenSSH远程管理。检查安全日志时,发现这几天几乎每天都有一堆IP过来猜密码。看来得修改一下登录验证方式,改为证书验证为好。 为防万一,临时启了个VNC,免得没配置完,一高兴顺手重启了sshd就麻烦了。(后来发现是多余的,只要事先开个putty别关闭就行了) 以下是简单的操作步骤: 1)先添加一个维护账号:msa2)然后su - msa3)ssh-keygen -t rsa指定密钥路径和输入口令之后,即在/home/msa/.ssh/中生成公钥和私钥:id_rsa id_rsa.pub4)cat id_rsa.pub >> authorized_keys至于为什么要生成这个文件,因为sshd_config里面写的就是这个。然后chmod 400 authorized_keys,稍微保护一下。5)用psftp把把id_rsa拉回本地,然后把服务器上的id_rsa和id_rsa.pub干掉6)配置/etc/ssh/sshd_configProtocol 2ServerKeyBits 1024PermitRootLogin no #禁止root登录而已,与本文无关,加上安全些#以下三行没什么要改的,把默认的#注释去掉就行了RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keysPasswordAuthentication noPermitEmptyPasswords no7)重启sshd/sbin/service sshd restart8)转换证书格式,迁就一下putty运行puttygen,转换id_rsa为putty的ppk证书文件9)配置putty登录在connection--SSH--Auth中,点击Browse,选择刚刚转换好的证书。然后在connection-Data填写一下auto login username,例如我的是msa在session中填写服务器的IP地址,高兴的话可以save一下10)解决一点小麻烦做到这一步的时候,很可能会空欢喜一场,此时就兴冲冲的登录,没准登不进去:No supported authentication methods available这时可以修改一下sshd_config,把PasswordAuthentication no临时改为:PasswordAuthentication yes 并重启sshd这样可以登录成功,退出登录后,再重新把PasswordAuthentication的值改为no,重启sshd。以后登录就会正常的询问你密钥文件的密码了,答对了就能高高兴兴的登进去。至于psftp命令,加上个-i参数,指定证书文件路径就行了。 如果你是远程操作服务器修改上述配置,切记每一步都应慎重,不可出错。如果配置错误,导致 SSH 连接不上,那就杯具了。 基本上,按上述四点配置好后,Linux 下的 SSH 访问,是比较安全的了。 参考技术A ssh服务安全配置

security 01: Linux基本防护 用户切换与提权 SSH访问控制 总结和答疑

LINUX安全与监控 6天
LINUX安全 3天
LINUX监控 3天
+++++++++++++++++++++++++
什么安全? 保护维护的服务器不受到攻击和破坏

攻击和破坏手段?
技术性
非技术性 : 指定规章制度和工作流程

技术性的攻击:
本地安全:

网络安全:防火墙
(软件防火墙 firewalld iptables )
RHEL7 RHEL6

             (硬件防火墙  独立的物理设备)
             sshd服务的配置 *(密钥对认证登录)

数据安全:数据在网络中传输会受到哪些攻击?
劫获 篡改 数字签名(不可否认性)
加密

LINUX安全day01
本地安全:
1 用户管理:
相关的命令及命令选项
useradd -u -g -G -s 用户名
useradd -s /sbin/nologin jim (用户作为进程的执行者)

#useradd tom

echo 123456 | passwd --stdin tom

usermod -L -U -u -g -G -s 用户名
userdel -r 用户名
passwd -S -l -u 用户名
chage -l -d -E 用户名
#chage -l tom
#chage -d 0 tom

chage -E 2018/01/31 jim

id 用户名
#id jim

相关的配置文件
/etc/passwd
#grep tom /etc/passwd

/etc/shadow
#grep tom /etc/shadow

/etc/login.defs

grep -v ‘^#‘ /etc/login.defs

#ls /etc/skel/ -a //用户系统环境模板文件
+++++++++++++++++++++++++++++++++++++++
隐藏内核和操作系统信息。(修改文件内容)
本地登录
[[email protected] ~]# cat /etc/issue
\S
Kernel \r on an \m
[[email protected] ~]#

网络连接
[[email protected] ~]# cat /etc/issue.net
\S
Kernel \r on an \m
[[email protected] ~]#
++++++++++++++++++++++++++++++++
文件系统安全:
修改记录历史命令的条目数量 默认1000
[[email protected] ~]# grep -n 1000 /etc/profile
45:HISTSIZE=1000
[[email protected] ~]#
[[email protected] ~]# sed -i ‘45s/1000/500/‘ /etc/profile
[[email protected] ~]# grep -n 500 /etc/profile
45:HISTSIZE=500
[[email protected] ~]# echo $HISTSIZE
1000
[[email protected] ~]# source /etc/profile
[[email protected] ~]# echo $HISTSIZE
500
[[email protected] ~]# ls ~/.bash_history
/root/.bash_history
[[email protected] ~]# vim ~/.bash_history

记录历史命令执行的时间 HISTTIMEFORMAT
#HISTTIMEFORMAT=‘%F %T ‘
[[email protected] ~]# history

#vim /etc/profile
....
export HISTTIMEFORMAT=‘%F %T ‘
:wq

程序和服务控制(把不需要的服务设置不开启动)
rhel7: systemctl disable 服务名
systemctl disable firewalld

rhel6: chkconfig 服务名 off
ntsysv
ls /etc/init.d/ 存放脚本文件
#chmod o-x /etc/init.d/* 撤销其他服务对脚本的执行权限

文件系统及挂载:
安装操作体系时,你的分区规划是怎么样的?
/ 根分区 没有单独分配存储空间的数据,都存放在根下(必须的)
/home 建议单独分区 (LV)
/var 建议单独分区 (LV) PV VG LV

/boot 引导分区 存放的是系统启动时的引导文件(可选)
swap 交换分区 从物理磁盘划分出来 (可选)

格式化的文件系统类型: ext2/3/4 xfs /proc

挂载方式:
命令行挂载 mount -t 文件系统类型 选项 分区名 目录名
开机自动挂载 /etc/fstab defaults默认挂载
触发挂载 autofs服务

defaults默认挂载 包括哪些挂载项?
#man mount 搜索defaults
defaults
Use default options: rw, suid, dev, exec, auto,
nouser, and async.

suid 允许在挂载目录下执行suid 和sgid权限的文件
exec 允许在挂载目录下执行二进制文件

fdisk /dev/vdb
fdisk -l /dev/vdb
blkid /dev/vdb1
mkfs.ext4 /dev/vdb1
blkid /dev/vdb1
mkdir /disk1
mount -t ext4 /dev/vdb1 /disk1
cp /usr/sbin/useradd /disk1
chmod o+x /disk1/useradd
chmod u+s /disk1/useradd

nosuid 不允许在挂载目录下执行suid 和sgid权限的文件
noexec 不允许在挂载目录下执行二进制文件

#cd /
#umount /disk1
#mount -t ext4 -o nosuid,noexec /dev/vdb1 /disk1
++++++++++++++++++++++++
给文件加特殊属性(加锁 解锁)系统文件配置文件 服务配置文件
i 对文件没有移动 编辑 删除的权限
a 只能以追加的访问编辑文件
查看 lsattr 文件名
添加 chattr +属性 文件名
删除 chattr -属性 文件名
+++++++++++++++++++++++++++++++++++++++++
用户切换
普通用户 ---------- > root 要输入对方的密码
普通用户 <----------- root 不输入对方密码
普通用户 <-----------> 普通用户 要输入对方的密码

#su //切换的root用户
#su - 用户 //既切换到用户的身份 ,又切换的用户的环境
#su 用户 //只切换到用户的身份 ,不会切换的用户的环境

#su - -c "命令" 用户 //切换到用户身份后执行命令
[[email protected] ~]$ su - -c "touch /root/a.txt" root

++++++++++++++++++++++++++++++++++++++++++
用户提权: 系统root用户让系统的普通用户可以执行自己可以使用的命令。
useradd webadmin ----> httpd
useradd dbadmin ----> mysqld

echo 123456 | passwd --stdin webadmin
echo 123456 | passwd --stdin dbadmin

/etc/sudoers 提权配置文件

用户名 主机名列表=命令列表 // 给单个用户提权
%用户组 主机名列表=命令列表 //给用户组用提权

*命令列表中的命令,必须要写命令的绝对路径
#which 命令名
#which systemctl

#vim /etc/sudoers

#webadmin localhost, host50=/usr/bin/systemctl * httpd, /usr/bin/vim /etc/httpd/conf/httpd.conf, NOPASSWD: ALL

mike localhost,host50=/sbin/*, !/sbin/ifconfig eth0
:wq!

%webgrp localhost, host50=/usr/bin/systemctl * httpd, /usr/bin/vim /etc/httpd/conf/httpd.conf

#useradd mike
#echo 123456 | passwd --stdin mike
#groupadd webgrp
#useradd webadmin2
#echo 123456 | passwd --stdin webadmin2
#usermod -G webgrp webadmin
#usermod -G webgrp webadmin2

提权时使用别名(别名名称必须使用大写字母表示)
定义用户别名
User_Alias 别名名称 = 用户名列表
User_Alias HTTPUSERS = webamdin, webadmin2

定义主机别名
Host_Alias 别名名称 = 主机名列表
Host_Alias MYPC=localhost, host50

定义命令别名
Cmnd_Alias 别名名称 = 命令列表
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

+++++++++++++++++++++++
使用别名提权
用户别名名称 主机别名=命令别名名称

HTTPUSERS MYPC=SOFTWARE,/usr/bin/systemctl * httpd, /usr/bin/vim /etc/httpd/conf/httpd.conf
+++++++++++++++++++++++++++++++
启用日志记录提权用户执行过命令
vim /etc/sudoers
Defaults logfile="/var/log/sudo"
:wq

#cat /var/log/sudo (提权用户执行过提权命令,系统自动创建此文件)
++++++++++++++++++++++++++
普通用测试提权?
查看可以使用的提权命令: sudo -l
执行提权命令: sudo 提权命令

++++++++++++++++++++++++++++++++++++++++++
ssh服务访问控制:

  • 服务启动后,
    默认允许所有客户端访问,
    默认登录认证方式:密码认证登录。
    [[email protected] ~]#systemctl sshd start
    [[email protected] ~]# netstat -utnalp | grep sshd
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1412/sshd

设置服务运行的参数

vim /etc/ssh/sshd_config

Port 22022
ListenAddress 192.168.4.50

配置白名单 : 只有在白名单列表里的用户才可以访问
AllowUsers 用户名1 用户名[email protected]客户端地址
AllowGroups 用户组名1 用户组名2

vim /etc/ssh/sshd_config
AllowUsers jerry [email protected]

配置黑名单 : 只有在黑名单列表里的用户不可以访问
DenyUsers 用户名1 用户名[email protected]客户端地址
DenyGroups 用户组名1 用户组名2

vim /etc/ssh/sshd_config
DenyUsers bob

++++++++++++++++++++++++++++++++
配置ssh服务仅允许密钥对认证登录
公钥 加密
私钥 解密

client 254:
1 创建密钥对: ls ~/.ssh/
[[email protected] ~]#rm -rf ~/.ssh
[[email protected] ~]#ssh-keygen // 创建密钥对
[[email protected] ~]# ls ~/.ssh/
id_rsa id_rsa.pub

ssh server 50
#rm -rf ~/.ssh

client 254: 把公钥上传给ssh服务器

ssh-copy-id [email protected] //上传密钥对

ssh server 50
[[email protected] ~]# ls ~/.ssh
authorized_keys

ssh server 50 禁用密码认证登录
vim /etc/ssh/sshd_config
81 PasswordAuthentication no //禁用密码认证登录
:wq
#systemctl restart sshd

client 254: 测试秘钥对认证登录
#ssh [email protected] //不用输入密码直接连接
#ssh [email protected] //不允许连接

++++++++++++++++++++++++++++++++
在客户端连接ssh服务器
ssh 用户名@ssh_ip //默认连接目标服务器的22端口
ssh -X -p 端口号 用户名@ssh_ip //连接目标服务器指定端口号
-X 可以显示图形界面

++++++++++++++++++++++++++++++++++++++++++
编写脚本 /root/autoadduser.sh
功能:批量添加系统用户,具体要求如下:
执行脚本时 可以自定义添加用户的个数 若没有指定个数的话默认只添加 1个 用户。 用户密码和用户名相同,强制用户首次登陆系统必须修改登录密码。用户添加后,在用户家目录下自动创建readme.txt文件。添加用户时若用户在系统内已经存在 给出提示信息: (jim 已经存在)。

以上是关于以CentOS为例总结如何配置SSH安全访问的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统下如何配置SSH_Centos7 ssh连接配置 CentOS7下安全配置

linux下实现ssh免密登录

远程访问安全-SSH

Centos 7.4中的远程访问控制

security 01: Linux基本防护 用户切换与提权 SSH访问控制 总结和答疑

手把手教你linux下配置vsftp服务器(以CentOS为例)--非常的详细