一,ssh服务概述
ssh服务概述
ssh
(Secure Shell)是一种用于在不安全网络中进行安全登录、远程执行命令及传输文件的网络协议。它通过加密技术来保证通信的保密性和完整性,主要用于替代不安全的telnet
、rlogin
、rsh
等协议。ssh
通常在22端口监听连接请求,可以通过防火墙及访问控制列表来增强其安全性。
sshd服务
sshd
(Secure Shell Daemon)是ssh
协议的服务端守护进程,负责响应客户端发起的连接请求。sshd
服务通过密钥认证、密码认证、基于PAM(Pluggable Authentication Module)认证等方式进行用户身份验证。
sshd
服务的主要功能
- 身份认证:支持多种认证方式,包括密码认证、密钥认证和双因素认证等。
- 数据加密:通过对称加密和非对称加密相结合的方式对传输的数据进行加密,确保通信过程的机密性。
- 完整性验证:通过哈希算法确保数据在传输过程中未被篡改。
- 隧道功能:支持TCP端口转发(隧道)功能,允许在不安全的网络上创建加密通道。
- 文件传输:支持使用
scp
或sftp
进行文件的安全传输。
sshd
配置文件
sshd
的配置文件通常位于/etc/ssh/sshd_config
。其中包含了服务端的监听端口、允许的认证方式、连接超时设置等配置选项。
二,加密算法
对称加密
对称加密是一种加密和解密都使用相同密钥的加密方法。加密和解密的过程是对称的,密钥的保密性至关重要,因为同一个密钥可以加密和解密数据。
特点
- 加密速度快:适合对大量数据进行快速加密和解密。
- 需要共享密钥:加密和解密使用相同的密钥,因此需要安全地共享密钥。
- 应用场景:常用于需要快速处理大量数据的场景,如文件加密、数据库加密等。
常见算法
- DES(Data Encryption Standard)
- AES(Advanced Encryption Standard)
- 3DES(Triple DES)
优缺点
- 优点:速度快、效率高,适合处理大规模数据。
- 缺点:密钥管理困难,密钥泄露会导致数据被轻易解密。
非对称加密
非对称加密使用一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。这意味着公钥可以公开,而私钥必须严格保密。加密和解密过程是不对称的,这种加密方式更安全,但加密速度较慢。
特点
- 更高的安全性:即使公钥泄露,只有持有私钥的用户才能解密数据。
- 不需要共享私钥:公钥可以公开分发,避免了密钥传输的风险。
- 应用场景:主要用于身份验证、密钥交换以及需要高安全性的场景,如SSL/TLS、数字签名等。
常见算法
- RSA(Rivest-Shamir-Adleman)
- DSA(Digital Signature Algorithm)
- ECC(Elliptic Curve Cryptography)
优缺点
- 优点:密钥管理较为简单,公钥公开不会影响安全性,适用于安全性要求高的应用。
- 缺点:计算速度相对较慢,不适合大数据量的加密。
彩虹表
彩虹表是一种利用预计算哈希链来高效破解哈希值的工具。其原理是通过将大量明文的哈希值计算成“哈希链”,并记录链的起点和终点,极大地减少存储量;在破解时,通过匹配目标哈希值和终点来找到对应的链,然后从起点顺次生成直到匹配目标哈希。彩虹表攻击速度极快,但仅适用于无盐哈希(即无额外随机数据干扰)。因此,为抵御彩虹表攻击,推荐在密码存储中加盐和多轮哈希,以使预计算的彩虹表无法复用。
三,ssh服务搭建与连接
搭建ssh服务器
安装 SSH 服务:yum install -y openssh-server(因为openssh是开源免费的)
启动和检查服务:
- sudo systemctl start sshd # 启动SSH服务
- sudo systemctl enable sshd # 设置开机启动
- sudo systemctl status sshd # 检查服务状态
查看 SSH 端口(服务器):通常默认端口为22,可以在
/etc/ssh/sshd_config
文件中修改端口号。
使用工具连接
- PuTTY(Windows):输入服务器 IP、端口和用户名后即可连接。
- Xshell(Windows):类似 PuTTY,支持更多选项。
- VS Code(Windows/Mac/Linux):可以通过扩展“Remote - SSH”插件来连接远程服务器,进行开发。
连接时需要提供 用户名、IP 地址、端口号(如非默认)及 密码 或 密钥。
通过linux命令连接
在 Linux 或windows, MacOS 中,可以直接在终端使用 ssh
命令连接远程服务器:
ssh 用户名@服务器IP地址 -p 端口号
如果使用密钥认证,可以指定私钥文件路径:
ssh -i /path/to/private_key 用户名@服务器IP地址
ssh配置文件的配置
SSH 配置文件可以细化连接的安全性、认证方法等。主要配置文件位于 /etc/ssh/sshd_config
####################################### # 1. 基础设置 ####################################### # 设置 SSH 服务的监听端口,默认为 22。可根据需求更改以增强安全性。 Port 22 # 仅在特定 IP 地址上监听 SSH 服务。可以设置为多个地址(多次使用)。 # 例如:只在 192.168.1.100 上监听 SSH。 # 意思是当服务器有多个ip的时候,客户机只能通过规定ip才可以登录服务器 ListenAddress 192.168.1.100 ListenAddress 192.168.2.100 # 如果想让 SSH 在所有接口上监听,可以使用 # ListenAddress 0.0.0.0 # 禁用反向 DNS 查询,以提高连接速度。 UseDNS no ####################################### # 2. 登录与认证设置 ####################################### # 禁止 root 用户直接登录,建议出于安全考虑。 PermitRootLogin no # 限制登录尝试的最大次数,以防止暴力破解攻击。 MaxAuthTries 3 # 禁用空密码登录,以确保账户安全。 PermitEmptyPasswords no # 允许的用户列表,仅允许 user1 和 user2 登录。 AllowUsers user1 user2 # 禁止的用户列表,不允许 user3 和 user4 登录。 DenyUsers user3 user4 # 允许的用户组,允许 sshusers 和 admins 组的成员登录。 AllowGroups sshusers admins # 禁止的用户组,不允许 group1 和 group2 组的成员登录。 DenyGroups group1 group2 # 设置用户登录的最大等待时间(秒),超过此时间将自动断开连接。 LoginGraceTime 60 ####################################### # 3. IP 地址限制 ####################################### # 仅允许特定 IP 地址范围的用户连接,提升安全性。 # 需要在防火墙中配置允许的规则。 # 例如:允许 192.168.1.0/24 网段访问 # sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT # sudo iptables -A INPUT -p tcp --dport 22 -j DROP ####################################### # 4. 会话与连接控制 ####################################### # 保持客户端连接,防止因长时间未操作而断开连接。 TCPKeepAlive yes # 服务端向客户端发送保活消息的时间间隔(秒),未响应的最大次数。 ClientAliveInterval 120 ClientAliveCountMax 3 # 限制每个会话允许的最大并发连接数。 MaxSessions 2 ####################################### # 5. 网络转发与隧道配置 ####################################### # 启用或禁用 SSH 隧道功能,通常用于 VPN 连接等场景。 PermitTunnel yes # 是否允许 X11 窗口转发,关闭可提高安全性。 X11Forwarding no # 是否允许 TCP 转发,通常用于端口转发和代理服务,建议关闭以提升安全性。 AllowTcpForwarding no # 将用户限制在指定目录内,适用于 SFTP 和安全性需求较高的环境。 ChrootDirectory /home/sftp-jail ####################################### # 6. 加密与认证算法设置 ####################################### # 指定允许的加密算法,确保使用强加密方式,去除不安全的旧算法。 Ciphers aes256-ctr,aes192-ctr,aes128-ctr # 指定允许的消息认证码算法,用于数据完整性和防篡改。 MACs hmac-sha2-256,hmac-sha2-512 # 指定密钥交换算法,移除不安全的算法如 diffie-hellman-group1-sha1。 KexAlgorithms diffie-hellman-group14-sha256,curve25519-sha256 # 指定服务器的主机密钥文件路径,提升身份验证的安全性。 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key ####################################### # 7. 日志记录与调试 ####################################### # 设置 SSH 日志级别,可以使用 INFO、VERBOSE、DEBUG 等等级。 LogLevel VERBOSE # 指定日志的目标(如 AUTH 或 AUTHPRIV),用于日志集中管理。 SyslogFacility AUTHPRIV
配置文件修改后,重启
sshd
服务使配置生效:
ssh服务扩展
scp命令:用linux之间的文件传输
scp 【选项】[源文件或目录] [目标地址]
-r
:递归复制整个目录。-P
:指定远程主机的端口(注意是大写的 P)。-i
:指定用于身份验证的私钥文件。-v
:启用详细模式,输出详细的执行信息,便于调试。- 涉及的远程的地址:远程用户名@远程ip:文件路径
可以知道,上传和下载就是将远程目录放在[源文件或目录]还是 [目标地址]的位置而已
剔除用户:
使用w,可以查看当前系统正在登录的终端有哪些
pkill -kill -t 【w中的TTY行名字】
四,跳板机服务搭建
概述
跳板机通常用于管理访问权限,以确保只有经过授权的用户能够访问内部网络中的关键系统。通过使用跳板机,用户的所有访问流量都会通过这个中间服务器,从而实现更好的安全性和审计能力。
免密登录
免密登录:我每次都要从客户机登录服务器,输入密码,现在我不想输入密码了
~/表示用户的家目录:本质上命令
步骤 操作 操作方 1. 生成 SSH 密钥对 在客户机上运行: ssh-keygen
客户机 按 Enter 接受默认设置。 客户机 2. 将公钥复制到目标服务器 使用以下命令(替换 username
和192.168.1.100
):客户机 ssh-copy-id username@192.168.1.100
客户机 输入目标服务器的密码。 客户机 3. 测试免密登录 尝试通过 SSH 登录到目标服务器: 客户机 ssh username@192.168.1.100
客户机 检查是否能够免密登录。 客户机 4. 权限设置(如有需要) 如果遇到问题,确保目标服务器上的权限设置正确: 服务器 chmod 700 ~/.ssh
服务器 chmod 600 ~/.ssh/authorized_keys
服务器 ssh-copy-id username@192.168.1.100
是将客户机原来的~/.ssh/xx.pub文件内容追加到了服务器的~/.ssh/authorized_keys
文件
存在的问题与解决方案
安全性:
- 问题:如果跳板机被攻破,攻击者可能会访问内部网络。
- 解决方案:确保跳板机定期更新,并启用强密码或密钥认证。
访问控制:
- 问题:可能需要管理多个用户的访问权限。
- 解决方案:使用基于角色的访问控制(RBAC)或结合 LDAP 进行用户管理。
监控与审计:
- 问题:需要监控跳板机上的活动以检测异常行为。
- 解决方案:使用日志管理工具,如 ELK Stack,来集中管理和分析日志。
性能:
- 问题:跳板机可能成为瓶颈,影响访问速度。
- 解决方案:根据需要进行负载均衡和优化。
用户体验:
- 问题:用户需要多次登录,增加了复杂性。
- 解决方案:可以考虑使用
ProxyJump
选项来简化连接流程。
五,综合实验
六,扩展内容
pwgen
是一个用于生成随机密码的命令行工具。它可以创建指定长度、强度和数量的随机密码,方便生成复杂且安全的密码。
pwgen [选项] [长度] [数量]
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo(更新一下)
- 长度:生成的每个密码的字符长度(默认为 8)。
- 数量:要生成的密码数量(默认为 1)。
常用选项
选项 描述 -s
生成强密码,使用随机字符(默认为字母和数字) -y
生成的密码包含特殊字符(如 !@#$%^&*()
)-B
生成不包含模棱两可的字符(如 0
、O
、1
、l
)-1
生成单个密码,而不是一组 -h
显示帮助信息 -v
显示版本信息 -n
仅生成数字密码 -r
生成可读性强的密码,避免复杂字符组合 -c
生成带有大写字母的密码 -H
使用shal hash给定的文件作为一个随机种子