赞
踩
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。SSH 为建立在应用层和传输层基础上的安全协议。
- 网络
- SSH客户端<------------------------------>SSH服务端
- 数据传输是加密的,可以防止信息泄漏
- 数据传输是压缩的,可以提高传输速度
SSH客户端: 常见的SSH客户端软件有Putty、Xshell、CRT、MobaXterm、FinalShell。
SSH服务端: OpenSSH 是实现SSH协议的开源软件项目,适用于各种UNIX、Linux 操作系统。
CentOS 7系统默认已安装openssh相关软件包,并将sshd服务添加为开机自启动。执行以下命令即可启动sshd服务:
systemctl start sshd
默认端口: sshd 服务默认使用的是TCP的22端口。
安全协议版本: 默认使用的是sshv2,sshv1 存在漏洞。
配置文件: sshd服务的默认配置文件是/etc/ssh/sshd_config
。
ssh_config: 为客户端配置文件,设置与客户端相关的应用可通过此文件实现。
sshd_config: 为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。
- # 客户端配置文件路径
- /etc/ssh/ssh_config
-
- # 服务端配置文件路径
- /etc/ssh/sshd_config
SSH服务端主要包括两个服务功能:SSH远程连接和SFTP服务。
SSHD 服务使用 SSH 协议可以用来进行远程控制,或在计算机之间传送文件。相比于Telnet,SSH更加安全,因为Telnet使用明文传输,SSH则是加密传输。
远程管理Linux系统基本上都要使用到SSH,原因很简单:Telnet、FTP等传输方式使用明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险。SSH(Secure Shell)目前较可靠,是专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题,通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
OpenSSH 常用配置文件有两个:
ssh_config: 为客户端配置文件,设置与客户端相关的应用可通过此文件实现。
sshd_config: 为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。
- # 客户端配置文件路径
- /etc/ssh/ssh_config
-
- # 服务端配置文件路径
- /etc/ssh/sshd_config
查看SSH版本:
ssh -V
服务名称: sshd
服务端主程序: /usr/sbin/sshd
服务端配置文件: /etc/ssh/sshd_config
使用以下命令通过SSH远程登录到另一台Linux主机:
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
如果当前登录用户是 root
,并且连接到另一台主机时也是使用 root
用户,可以直接使用 ssh IP
,默认端口即可。如果端口不是默认的,需要使用 -p
指定端口。
例如,使用默认端口:
ssh root@192.168.1.100
使用自定义端口:
ssh root@192.168.1.100 -p 2222
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
使用 -l
选项指定登录名称和端口:
ssh -l [远程主机用户名] [远程服务器主机名或IP地址] -p port
例如:
ssh -l root 192.168.1.100 -p 2222
- -l:指定登录名称。
-
- -p:指定登录端口(当服务端的端口非默认时,需要使用 -p 指定端口进行登录)。
第一次登录服务器时,系统没有保存远程主机的信息。为了确认该主机身份,系统会提示用户是否继续连接。输入 yes
后登录,系统会将远程服务器信息写入用户主目录下的 $HOME/.ssh/known_hosts
文件中。下次再进行登录时,因为保存有该主机信息,就不会再提示了。
在平时工作中,有时候需要SSH登录到别的Linux主机上,但有时候SSH登录会被禁止,并弹出如下类似提示:
- The authenticity of host '192.168.10.9 (192.168.10.9)' can't be established.
- ECDSA key fingerprint is SHA256:AaGpHeEiRuXMy96oezzV6TOej5nJJmZIe/djqR7qCVk.
- ECDSA key fingerprint is MD5:78:a1:b1:1c:36:76:c7:34:54:87:cc:ea:51:3f:0c:24.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added '192.168.10.9' (ECDSA) to the list of known hosts.
- Authentication failed.
SSH 会把每个访问过的计算机的公钥(public key)记录在 ~/.ssh/known_hosts
文件中。当下次访问相同计算机时,OpenSSH 会核对公钥。如果公钥不同,OpenSSH 会发出警告,避免受到DNS劫持之类的攻击。
使用 -o StrictHostKeyChecking=no
选项:
ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx
修改 /etc/ssh/ssh_config
文件(或 $HOME/.ssh/config
),添加以下配置:
- StrictHostKeyChecking no
- UserKnownHostsFile /dev/null
一台主机上有多个Linux系统,会经常切换,这些系统使用同一IP。登录过一次后会把SSH信息记录在本地的 ~/.ssh/known_hosts
文件中,切换系统后再用SSH访问这台主机就会出现冲突警告,需要手动删除或修改 known_hosts
文件中的内容。
OpenSSH软件包提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,替代原来的Telnet或FTP等服务。
OpenSSH服务需要4个软件包:
openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH服务器及客户端需要的核心文件。
openssh-clients-5.3p1-114.el6_7.x86_64:OpenSSH客户端软件包。
openssh-server-5.3p1-114.el6_7.x86_64:OpenSSH服务器软件包。
openssh-askpass-5.3p1-114.el6_7.x86_64:支持对话框窗口的显示,是一个基于X系统的组件。
在进行升级或编译安装OpenSSH之前,可能存在风险,建议先安装Telnet并且测试用户登录无问题后再进行升级。
可以通过以下命令编译并安装OpenSSH的RPM包:
- rpmbuild -tb openssh-<version>.tar.gz
- sudo rpm -ivh /path/to/openssh-<version>.rpm
PAM(可插入认证模块):用于集中管理系统的各种认证方式。
用户安全:通过限制用户权限和使用强密码来增强安全性。
SSHD安全:通过配置SSHD服务的安全选项来保护服务器。
Shell脚本编辑配置安全:编写安全的Shell脚本,避免潜在的安全漏洞。
SSH 预设使用 22 这个端口,你可以通过在 SSH 服务器的配置文件 /etc/ssh/sshd_config
中修改或添加多个端口来改变默认端口。例如,想要开放 SSHD 端口为 22 和 222,则在配置文件中添加如下行:
- # /etc/ssh/sshd_config
- Port 22
- Port 222
然后重新启动 SSHD 服务以应用更改:
sudo systemctl restart sshd
建议修改默认端口号以防止被恶意破解。
在配置文件 /etc/ssh/sshd_config
中设置 SSHD 服务器绑定的 IP 地址,0.0.0.0
表示侦听所有地址:
- # /etc/ssh/sshd_config
- ListenAddress 0.0.0.0
安全建议:如果主机不需要从公网 SSH 访问,可以把监听地址改为内网地址。
在配置文件 /etc/ssh/sshd_config
中设置协议版本为 SSH2,SSH1 存在漏洞与缺陷:
- # /etc/ssh/sshd_config
- Protocol 2
在配置文件 /etc/ssh/sshd_config
中禁用 DNS 反向解析可以提高服务器的响应速度:
- # /etc/ssh/sshd_config
- UseDNS no
在配置文件 /etc/ssh/sshd_config
中设置日志记录信息类型为 AUTHPRIV
:
- # /etc/ssh/sshd_config
- SyslogFacility AUTHPRIV
SSHD 服务日志存放在:/var/log/secure
。
在配置文件 /etc/ssh/sshd_config
中设置登录宽限时间(默认 2 分钟),系统将在此时间内未成功登录则强制断线:
- # /etc/ssh/sshd_config
- LoginGraceTime 2m
在真实的生产环境中,不允许 root 用户直接登录,只允许普通用户登录后再切换到 root 用户:
- # /etc/ssh/sshd_config
- PermitRootLogin no
创建用户 zhangsan
和 lisi
,并将 zhangsan
用户加入 wheel
组以获取 sudo 权限:
- sudo useradd zhangsan
- sudo useradd lisi
- sudo passwd zhangsan
- sudo passwd lisi
- sudo usermod -aG wheel zhangsan
在配置文件 /etc/ssh/sshd_config
中配置密码验证:
- # /etc/ssh/sshd_config
- PasswordAuthentication yes
禁止空密码登录:
- # /etc/ssh/sshd_config
- PermitEmptyPasswords no
在配置文件 /etc/ssh/sshd_config
中显示上次登录的信息:
- # /etc/ssh/sshd_config
- PrintLastLog yes
在配置文件 /etc/ssh/sshd_config
中设置每个连接最大允许的认证次数(默认值为 6):
- # /etc/ssh/sshd_config
- MaxAuthTries 6
在配置文件 /etc/ssh/sshd_config
中使用 AllowUsers
只允许特定用户登录:
- # /etc/ssh/sshd_config
- AllowUsers zhangsan@192.168.10.10 wangwu
使用 ssh
命令的扩展参数:
ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip "command"
参数说明:
ConnectTimeout=3
:连接超时时间,3秒
ConnectionAttempts=5
:连接失败后重试次数,5次
PasswordAuthentication=no
:不使用密码认证
StrictHostKeyChecking=no
:自动信任主机并添加到 known_hosts
文件
示例:
ssh -o StrictHostKeyChecking=no root@192.168.10.0
在使用非官方 RPM 包时,可以通过以下命令进行检查:
rpm --checksig package-name.rpm
设定密码策略和强度: 编辑 /etc/security/pwquality.conf
文件,设置密码强度规则,例如:
- minlen=12
- minclass=4
对用户的登录次数进行限制: 编辑 /etc/pam.d/sshd
文件,添加以下内容:
auth required pam_tally2.so onerr=fail deny=5 unlock_time=900
禁止 ROOT 用户远程登录:
- # /etc/ssh/sshd_config
- PermitRootLogin no
设置历史命令保存条数和账户超时时间: 编辑 /etc/profile
文件,添加以下内容:
- HISTSIZE=1000
- TMOUT=300
设置只有指定用户组才能使用 su
命令切换到 root 用户: 编辑 /etc/pam.d/su
文件,添加以下内容:
auth required pam_wheel.so use_uid
对重要文件进行锁定,即使 ROOT 用户也无法删除:
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow
建立日志服务器: 设置集中日志服务器,编辑 /etc/rsyslog.conf
文件,添加远程日志服务器配置:
*.* @@remote-log-server:514
然后重启 rsyslog 服务:
sudo systemctl restart rsyslog
对服务器中本地系统用户的登录名称、密码进行验证。使用方便,但安全性较低,容易被假冒。
要求提供匹配的密钥信息才能通过验证。建议将密码验证方式禁用,只允许启用密钥对验证方式。在 /etc/ssh/sshd_config
中进行配置:
- # /etc/ssh/sshd_config
- PasswordAuthentication no
- PubkeyAuthentication yes
在客户端使用 ssh-agent
和 ssh-add
管理公钥以实现免密登录:
在客户端生成密钥对:
ssh-keygen -t rsa
将公钥复制到服务器:
ssh-copy-id user@server
启动 ssh-agent
并添加私钥:
- ssh-agent bash
- ssh-add
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上建立安全的通信通道。密钥对验证是SSH的一种重要特性,它提供了一种安全且便捷的身份验证方式。本章将详细介绍如何构建和使用SSH密钥对验证。
在非对称加密技术中,有两种密钥,分别是公钥和私钥。私钥由密钥对所有者持有,不可公布;公钥由密钥对持有者公布给他人。
公钥用于加密数据:用公钥加密的数据只能使用私钥解密。
私钥用于解密数据:只有持有私钥的用户才能解密数据,从而保证了数据的安全性。
生成密钥对:SSH客户端通过加密算法生成一对密钥(公钥和私钥)。
分发公钥:公钥发送给服务器端,客户端保留私钥。
连接过程:
客户端向SSH服务器发出请求,用联机的用户密钥进行验证。
服务器检查公钥是否匹配,如果匹配则用公钥加密"质询"(challenge)并发送给客户端。
客户端用私钥解密"质询",完成身份验证。
修改SSH服务器的配置文件 /etc/ssh/sshd_config
以启用密钥对验证,并禁用密码验证:
- vim /etc/ssh/sshd_config
-
- PasswordAuthentication no # 禁用密码验证
- PubkeyAuthentication yes # 启用密钥对验证
- AuthorizedKeysFile .ssh/authorized_keys # 指定公钥库文件
在客户端生成密钥对:
ssh-keygen -t rsa
根据提示完成密钥对生成,默认存放在 ~/.ssh
目录下。
将生成的公钥文件上传到服务器:
scp ~/.ssh/id_rsa.pub user@server:/home/user/.ssh/authorized_keys
或者使用 ssh-copy-id
命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
在客户端使用密钥对验证连接到服务器:
ssh user@server
如果设置正确,将无需输入密码即可登录。
在日常运维中,安全地传输文件是非常重要的。本章将介绍两种安全的文件传输方法:scp
和 sftp
。
scp
进行文件传输scp
(Secure Copy)用于在Linux下进行远程拷贝文件,传输过程是加密的。
scp localfile user@server:/remote/path
scp user@server:/remote/file /local/path
scp -r localdir user@server:/remote/path
sftp
进行文件传输sftp
(Secure File Transfer Protocol)是SSH的一部分,用于安全地传输文件。
sftp user@server
sftp> help
sftp> get remote_file /local/path
sftp> put local_file /remote/path
- sftp> cd remote_dir
- sftp> ls
TCP Wrappers 提供了一种对TCP服务进行访问控制的机制。
TCP Wrappers 通常是默认安装的,可以使用以下命令检查:
rpm -q tcp_wrappers
/etc/hosts.allow
:允许访问的策略。
/etc/hosts.deny
:拒绝访问的策略。
允许从 192.168.80.0/24
网段和 12.0.0.1
IP 地址访问 sshd
服务:
- # /etc/hosts.allow
- sshd: 192.168.80.*, 12.0.0.1
-
- # /etc/hosts.deny
- sshd: ALL
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。