在实际生产环境中, 不可能一直在服务器本地对服务器进行相应的管理, 大多数企业服务器都是通过远程登录的方式进行管理的. 当需要从一个工作站管理数以百计的服务器主机时, 远程维护的方式将更占优势.
SSH 简介
SSH(Secure Shell)是一种安全通道协议, 主要用来实现字符界面的远程登录, 远程复制等功能. SSH 协议对通信双方的数据传输进行加密处理, 其中包括用户登录时输入的用户口令. 比以往的 Telnet(远程登录),RSH(远程执行命令)等传统的方式相比, SSH 协议提供了更好的安全性.
一, 配置 OpenSSH 服务端
OpenSSH 是实现 SSH 协议的开源软件项目. 在 CentOS 7.3 系统中. OpenSSH 服务器由 openssh,openssh-server 等软件包提供(默认已安装), 并已将 sshd 添加为标准的系统服务.
1. 服务监听选项
sshd 服务使用的默认端口号为 22, 必要时建议修改此端口号, 并指定监听服务的具体 IP 地址, 以提高在网络中的隐蔽性. 除此之外, SSH 协议的版本选用 v2 比 v1 的安全性要更好, 禁用 DNS 反向解析可以提高服务器的响应速度.
- [[email protected] ~]# VIM /etc/SSH/sshd_config // 修改 sshd 服务的主配置文件
- ............ // 省略部分内容
- Port 22 // 监听端口为 22
- ListenAddress 0.0.0.0 // 监听地址为 0.0.0.0, 表示全部监听
- Protocol 2 // 使用 SSH v2 的版本
- UseDNS no // 禁用 DNS 反向解析, 提高响应速度
- ............ // 省略部分内容
- [[email protected] ~]# systemctl restart sshd // 重新启动 sshd 服务
2. 用户登录控制
sshd 服务默认允许 root 用户登录, 但在网络中是很大的安全隐患, 普遍的做法是普通用户, 然后切换到 root 用户.
- [[email protected] ~]# VIM /etc/SSH/sshd_config // 修改 sshd 服务的主配置文件
- ............ // 省略部分内容
- LoginGraceTime 2m // 登录验证时间为 2 分钟
- PermitRootLogin no // 禁止 root 用户登录
- MaxAuthTries 6 // 最大重试次数为 6 次
- PermitEmptyPasswords no // 禁止空密码登录
- ............ // 省略部分内容
- [[email protected] ~]# systemctl restart sshd // 重新启动 sshd 服务
当希望只允许或禁止某个用户登录时, 可以使用 AllowUsers 或 DenyUsers 配置, 两者用法类似(但是注意不要同时使用). 例如允许 xiaoli 和 xiaozhang 用户登录, 且其中 xiaozhang 用户仅能从 IP 地址为 192.168.1.2 的地址远程登录.
- [[email protected] ~]# VIM /etc/SSH/sshd_config // 修改 sshd 服务的主配置文件
- ............ // 省略部分内容
- AllowUsers xiaoli [email protected] // 多个用户之间用空格进行分隔
- [[email protected] ~]# systemctl restart sshd // 重新启动 sshd 服务
3. 登录验证方式
sshd 服务支持两种验证方式:
** 密码验证:** 对服务器中的本地系统用户的登录名称, 密码进行验证. 这种方式使用最为简便, 但是系统用户密码存在可能遭遇密码穷举(暴力破解);
** 密钥对验证:** 要求提供相匹配的密钥信息才能通过验证. 通常先在客户端中创建一对密钥, 然后将公钥文件存放到服务器指定位置. 远程登录时, 系统将使用公钥, 私钥进行加密 / 解密验证, 这种方式不易被假冒, 且可以免交互登录, 在 Shell 中被广泛应用.
当密码验证, 密钥对验证都启用时, 服务器将优先使用密钥对验证! 没有特殊要求, 建议两种方式都启用!
- [[email protected] ~]# VIM /etc/SSH/sshd_config // 修改 sshd 服务的主配置文件
- ............ // 省略部分内容
- PasswordAuthentication yes // 启用密码验证
- PubkeyAuthentication yes // 启用密钥对验证
- AuthorizedKeysFile .SSH/authorized_keys // 指定公钥库文件
- ............ // 省略部分内容
- [[email protected] ~]# systemctl restart sshd // 重新启动 sshd 服务
二, 使用 SSH 客户端程序
在 CentOS 7.3 系统中, OpenSSH 客户端由 openssh-clients 软件包提供(默认已安装), 其中包括 SSH 远程登录命令, 以及 scp,sftp 远程复制和文件传输命令等.
1. 命令程序 (SSH,scp,sftp) 应用
1)SSH 远程登录
通过 SSH 命令可以远程登录 sshd 服务, 为用户提供一个安全的 Shell 环境, 以便对服务器进行管理和维护!
[[email protected] ~]# SSH [email protected]
如果 sshd 服务器使用非默认的端口号 (比如 2222) 则需要使用 "-p" 选项指定端口号.
- [[email protected] ~]# SSH -p 2222 [email protected]
- [email protected]'s password: // 输入密码
- [[email protected] ~]$ // 登录成功
2)scp 远程复制
- [[email protected] ~]# scp [email protected]:/etc/passwd /mnt
- // 从服务器下载文件
- [email protected]'s password:
- passwd 100% 2360 2.3KB/s 00:00
- [[email protected] ~]# scp 123.txt [email protected]:/mnt
- // 从客户端上传文件
- [email protected]'s password:
- 123.txt 100% 0 0.0KB/s 00:00
如果需要指定端口, 使用 "-P" 选项!
3)sftp 安全 FTP
通过 sftp 命令可以利用 SSH 安全连接与远程主机上传, 下载文件, 采用了与 FTP 类似的登录过程和交互式环境, 便于目录资源管理.
- [[email protected] ~]# sftp [email protected]
- [email protected]'s password:
- Connected to 192.168.1.1.
- sftp> put 456.txt // 上传文件
- Uploading 456.txt to /root/456.txt
- 456.txt 100% 0 0.0KB/s 00:00
- sftp> get /root/789.txt // 下载文件
- Fetching /root/789.txt to 789.txt
- sftp> bye
2. 图形化工具
在 Windows 主机上可以使用一些列图形化工具 Xshell,SecureCRT,Putty 等图形工具, 支持 Telnet,SSH,SFTP 等协议, 方便对 Linux 主机进行远程管理. 这些图形化工具都提供了中文界面, 功能和操作比较简单, 这里不再做深入介绍.
三, 构建密钥对验证的 SSH 体系
密钥对验证方式可以为远程登录提供提供更好的安全性, 流程图:
1)第一种实现方法:
1. 在客户端创建密钥对
在 Linux 客户端中, 通过 SSH-keygen 工具为当前用户创建密钥对文件, 可用的加密算法为 ECDSA 或 DSA(SSH-keygen 命令的 "-t" 选项用于指定算法类型)
- [email protected] ~]# su - xiaowang // 切换到用户 xioawang
- [[email protected] ~]$ SSH-keygen -t ecdsa // 创建基于 ECDSA 算法的 SSH 密钥对
- Generating public/private ecdsa key pair.
- Enter file in which to save the key (/home/xiaowang/.SSH/id_ecdsa): // 指定私钥存放位置
- Created directory '/home/xiaowang/.ssh'.
- Enter passphrase (empty for no passphrase): // 设置私钥短语
- Enter same passphrase again: // 确认所设置的短语
- Your identification has been saved in /home/xiaowang/.SSH/id_ecdsa.
- Your public key has been saved in /home/xiaowang/.SSH/id_ecdsa.pub.
- The key fingerprint is:
- 13:c2:03:63:bc:2e:d8:7e:be:f1:1b:1d:95:6b:4c:49 [email protected]
- The key's randomart image is:
- +--[ECDSA 256]---+
- | .+ E |
- | ..+ . o |
- | .+ . = |
- | . o = . |
- | o . S + |
|. o . . + |
| . .. . . |
| . .o . |
- | oo.o. |
- +-----------------+
- [[email protected] ~]$ ls -lh ~/.SSH/id_ecdsa*
-rw-------. 1 xiaowang xiaowang 227 8 月 8 16:45 /home/xiaowang/.SSH/id_ecdsa
-rw-r--r--. 1 xiaowang xiaowang 179 8 月 8 16:45 /home/xiaowang/.SSH/id_ecdsa.pub
新生成的密钥对文件中, id_ecdsa 是私钥文件 , 权限为 600, 需妥善保管; id_ecdsa.pub 是公钥文件, 用来提供给 SSH 服务器.
2. 将公钥文件上传至服务器
将刚才生成的公钥文件上传到服务端用户的公钥数据库中.
- [[email protected] ~]$ scp ~/.SSH/id_ecdsa.pub [email protected]:/mnt
- [email protected]'s password: // 输入密码
- id_ecdsa.pub 100% 179 0.2KB/s 00:00
- // 上传成功
3. 在服务器中导入公钥文本
在服务器中, 目标用户 (指用阿里远程登录的账号) 的公钥数据库位于~/.SSH 目录, 默认的文件名 "authorized_keys", 需要自己手动创建!
- [[email protected] ~]# mkdir /home/xiaozhang/.SSH
- [[email protected] ~]# cat /mnt/id_ecdsa.pub>> /home/xiaozhang/.SSH/authorized_keys
- [[email protected] ~]# cat /home/xiaozhang/.SSH/authorized_keys
- ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJmtmVbjnjH6NbWBRQcFjbYHoDBILQYclqrIHbVe0oyA15IXd+WBGsOcX3FYX8FYnIPHfL36Auj7aWb2MuVqmac= [email protected]
4. 在客户端使用密钥对验证
- [[email protected] ~]$ SSH [email protected]
- Last login: Thu Aug 8 16:03:33 2019 from 192.168.1.2
- // 不用输入密码, 即可连接, 实验完成!
2)第二种实现方法:
- [[email protected] ~]# SSH-keygen -t ecdsa
- // 以 root 为例, 生成 root 用户的密钥对文件
- [[email protected] ~]# SSH-copy-id -i ~/.SSH/id_ecdsa.pub [email protected]
- //"-i" 用来指定公钥文件, 这一步把刚才第二, 三步结合在一起
- /bin/SSH-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
- /bin/SSH-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
- [email protected]'s password: // 输入服务端 root 用户密码
- Number of key(s) added: 1
- Now try logging into the machine, with: "ssh'[email protected]'"
- and check to make sure that only the key(s) you wanted were added.
- [[email protected] ~]# SSH [email protected]
- Last login: Thu Aug 8 17:03:20 2019
- // 验证实验效果
使用密钥对验证的方式登录时, 不需要知道目标用户的面膜, 而是验证客户端用户的私钥短语并检查私钥, 公钥是否配对, 这样安全性更好.
四, TCP Wrappers 访问控制
1)TCP Wrappers 概述
TCP Wrappers 将 TCP 服务程序 "包裹" 起来, 代为坚挺 TCP 服务程序的端口, 增加了一个安全监测过程, 外联的连接请求必须先通过这层安全监测, 获得许可证才能访问真正的服务程序. 如图:
对于大多数 Linux 发行版, TCP Wrappers 是默认提供的功能. CentOS 7.3 使用的软件包是 tcp_wrappers-7.6-77.el7.x86_64.rpm.
对应 TCP Wrappers 保护机制的两种实现方式:
1. 直接使用 tcpd 程序对其他服务程序进行保护, 需要运行 tcpd;
2. 由其他网络服务程序调用 libwrap.so.* 链接库, 不需要运行 tcpd 程序.
通常, 链接库方式的应用要更为广泛, 也更有效率.
2)TCP Wrappers 的访问策略
TCP Wrappers 机制的保护对象为各种网络服务程序, 针对访问服务的客户端地址进行访问控制, 对应的两个策略文件为 / etc/hosts.allow 和 / etc/hosts.deny , 分别用阿里设置允许和拒绝的策略.
1, 策略配置格式
服务列表: 客户机地址列表
服务器程序列表, 客户端地址列表之间用冒号进行分隔, 在列表内的多个项之间用逗号分隔.
1)服务程序列表
2)客户端地址列表
2, 策略的应用顺序
先检查 hosts.allow, 找到匹配则允许访问
否则再检查 hosts.deny, 找到则拒绝访问
若两个文件中均无匹配策略, 则默认允许访问
3, 配置实例
要求: 希望仅允许 192.168.1.0 网段的主机访问 sshd 服务
- [[email protected] ~]# VIM /etc/hosts.allow
- sshd:192.168.1.
- [[email protected] ~]# VIM /etc/hosts.deny
- sshd:ALL
来源: http://www.bubuko.com/infodetail-3147822.html