目录
一、SSH概述与使用
1.1 定义
1.2 优点
1.3 原理
1.4 命令登录
1.5 跳板登录
1.6 远程控制
二、SSH配置
2.1 常用的服务端配置
2.2 ssh服务最优配置
三、免密登录
3.1 操作原理
3.2 操作步骤
一、SSH概述与使用
1.1 定义
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。
1.2 优点
-
数据传输是加密的,可以防止信息泄漏
-
数据传输是压缩的,可以提高传输速度
1.3 原理
-
客户端发起链接请求
-
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
-
客户端生成密钥对
-
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
-
客户端发送加密值到服务端,服务端用私钥解密,得到Res
-
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
-
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
1.4 命令登录
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
#当登录的远程主机的用户为超级管理员,则可以省略主机名和@
#不加p选项,默认端口为22
#一般,当端口被更改时,才需要加上选项p
若想要关闭安全验证,可以修改以下配置文件/etc/ssh/ssh_config:
vim /etc/ssh/ssh_config
...
...
... 修改为
#StrictHostKeyChecking ask ----------> StrictHostKeyChecking no
...
...
...
:wq
ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p port
-l :-l 选项,指定登录名称。
-p: -p 选项,指定登录端口(当服务端的端口非默认时,需要使用-p 指定端口进行登录)
1.5 跳板登录
该方式一般用于远端机器拒绝当前设备的IP访问,从而需要通过其他设备来连接到远端机器
步骤如下
1. 先模拟拒绝访问的情景
#远端设备的配置 iptables -A INPUT -s 当前需要访问远端设备的主机IP -j REJECT
2.1 使用ssh的-t选项进行跳板登录
ssh -t IP1 ssh -t IP2.... ssh -t 目标IP # IP1和IP2为跳板机的IP地址,先跳转到IP1,再跳转到IP2 #两次跳转成功后,才能远程连接到目标设备 #举例# ssh -t 设备1IP ssh -t 设备2IP ssh -t 目的设备IP #跳转两次,从当前设备远程连接IP地址为最终目的主机或者服务器
2.2 使用ssh的-J选项进行跳板登录
ssh -J IP1,IP2... 目标IP #IP1 IP2为中间设备的IP地址 #举例 ssh -J 设备1IP,设备2IP 目的设备IP
1.6 远程控制
不登陆到远端设备,而将命令的输出打印到本机
ssh 远端IP cmd(命令)
#直接在ssh命令后跟上想要使用的命令
二、SSH配置
2.1 常用的服务端配置
修改默认端口
vim /etc/ssh/sshd_config ... ... ... Port 22 -------> Port 自定义端口号
禁用root用户登录注意,虽然不允许root登录,但是使用普通用户,仍然可以是用su命令切换至rootvim /etc/ssh/sshd_config ... ... ... #PermitRootLogin yes ---------> PermitRootLogin no
白名单黑名单列表vim /etc/ssh/sshd_config ... ... ... #在末行手动添加 AllowUsers zhangsan@192.168.91.101 lisi #只允许192.168.91.101设备以zhangsan的身份访问本机 #允许所有的主机访问本机的lisi用户
DenyUsers liwu #不允许所有的设备访问本机的liwu
输错密码限制
vim /etc/ssh/sshd_config ... ... ... MaxAuthTries 2 #最大输错次数为2,默认值为3 ssh -o NumberOfPasswordPrompts=8 root@192.168.91.100 #设置尝试次数为8
2.2 ssh服务最优配置
建议使用非默认端口 22
禁止使用protocol version 1
限制可登录用户 白名单
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址 公网 内网
基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志 分离
#############1. 关于 SSH Server 的整体设定##############
#Port 22
##port用来设置sshd监听的端口,为了安全起见,建议更改默认的22端口为5位以上陌生端口
#Protocol 2,1
Protocol 2
##设置协议版本为SSH1或SSH2,SSH1存在漏洞与缺陷,选择SSH2
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress用来设置sshd服务器绑定的IP地址
##监听的主机适配卡,举个例子来说,如果您有两个 IP, 分别是 192.168.0.11 及 192.168.2.20 ,那么只想要
###开放 192.168.0.11 时,就可以设置为:ListenAddress 192.168.0.11
####表示只监听来自 192.168.0.11 这个 IP 的SSH联机。如果不使用设定的话,则预设所有接口均接受 SSH
#############2. 说明主机的 Private Key 放置的档案##########
#ListenAddress ::
##HostKey用来设置服务器秘钥文件的路径
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
##设置SSH version 1 使用的私钥
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
##设置SSH version 2 使用的 RSA 私钥
#HostKey /etc/ssh/ssh_host_dsa_key
##设置SSH version 2 使用的 DSA 私钥
#Compression yes
##设置是否可以使用压缩指令
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
##KeyRegenerationInterval用来设置多长时间后系统自动重新生成服务器的秘钥,
###(如果使用密钥)。重新生成秘钥是为了防止利用盗用的密钥解密被截获的信息。
#ServerKeyBits 768
##ServerKeyBits用来定义服务器密钥的长度
###指定临时服务器密钥的长度。仅用于SSH-1。默认值是 768(位)。最小值是 512 。
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
##SyslogFacility用来设定在记录来自sshd的消息的时候,是否给出“facility code”
当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,sshd 服务日志存放在:/var/log/secure。
#LogLevel INFO
##LogLevel用来设定sshd日志消息的级别
定义登录记录的等级
#################3.安全认证方面的设定################
#############3.1、有关安全登录的设定###############
# Authentication:
限制用户必须在指定的时限内认证成功,0 表示无限制。默认值是 120 秒。
#LoginGraceTime 2m
LoginGraceTime用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为妙
#PermitRootLogin yes
PermitRootLogin用来设置能不能直接以超级用户ssh登录,root远程登录Linux很危险,建议注销或设置为no
#StrictModes yes
StrictModes用来设置ssh在接收登录请求之前是否检查用户根目录和rhosts文件的权限和所有权,建议开启
建议使用默认值"yes"来预防可能出现的低级错误。
#RSAAuthentication yes
##RSAAuthentication用来设置是否开启RSA密钥验证,只针对SSH1
#PubkeyAuthentication yes
##PubkeyAuthentication用来设置是否开启公钥验证,如果使用公钥验证的方式登录时,则设置为yes
#AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysFile用来设置公钥验证文件的路径,与PubkeyAuthentication配合使用,默认值是".ssh/authorized_keys"。
该指令中可以使用下列根据连接时的实际情况进行展开的符号: %% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名
经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。
#############3.2、安全验证的设定###############
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
是否使用强可信主机认证(通过检查远程主机名和关联的用户名进行认证)。仅用于SSH-1。
这是通过在RSA认证成功后再检查 ~/.rhosts 或 /etc/hosts.equiv 进行认证的。出于安全考虑,建议使用默认值"no"。
# similar for protocol version 2
HostbasedAuthentication no
这个指令与 RhostsRSAAuthentication 类似,但是仅可以用于SSH-2。
# Change to yes if you don't trust ~/.ssh/known_hosts for
RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
IgnoreUserKnownHosts用来设置ssh在进行RhostsRSAAuthentication安全验证时是否忽略用户的“/$HOME/.ssh/known_hosts”文件
Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
IgnoreRhosts用来设置验证的时候是否使用“~/.rhosts”和“~/.shosts”文件
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
PasswordAuthentication用来设置是否开启密码验证机制,如果用密码登录系统,则设置yes
#PermitEmptyPasswords no
PermitEmptyPasswords用来设置是否允许用口令为空的账号登录系统,设置no
#PasswordAuthentication yes
是否允许使用基于密码的认证。默认为"yes"。
PasswordAuthentication yes
# Change to no to disable s/key passwords
设置禁用s/key密码
ChallengeResponseAuthentication yes
ChallengeResponseAuthentication 是否允许质疑-应答(challenge-response)认证
ChallengeResponseAuthentication no
########3.3、与 Kerberos 有关的参数设定,指定是否允许基于Kerberos的用户认证########
#Kerberos options
KerberosAuthentication no
是否要求用户为PasswdAuthentication提供的密码必须通过Kerberos KDC认证,要使用Kerberos认证,
服务器必须提供一个可以校验KDC identity的Kerberos servtab。默认值为no
KerberosOrLocalPasswd yes
如果Kerberos密码认证失败,那么该密码还将要通过其他的的认证机制,如/etc/passwd
在启用此项后,如果无法通过Kerberos验证,则密码的正确性将由本地的机制来决定,如/etc/passwd,默认为yes
KerberosTicketCleanup yes
设置是否在用户退出登录是自动销毁用户的ticket
KerberosGetAFSToken no
如果使用AFS并且该用户有一个Kerberos 5 TGT,那么开启该指令后,
将会在访问用户的家目录前尝试获取一个AFS token,并尝试传送 AFS token 给 Server 端,默认为no
3.4、与 GSSAPI 有关的参数设定,指定是否允许基于GSSAPI的用户认证,仅适用于SSH2####
GSSAPI 是一套类似 Kerberos 5 的通用网络安全系统接口。
如果你拥有一套 GSSAPI库,就可以通过 tcp 连接直接建立 cvs 连接,由 GSSAPI 进行安全鉴别。
GSSAPI options
GSSAPIAuthentication no
GSSAPIAuthentication 指定是否允许基于GSSAPI的用户认证,默认为no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GSSAPICleanupCredentials 设置是否在用户退出登录是自动销毁用户的凭证缓存
GSSAPICleanupCredentials yes
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication mechanism.
# Depending on your PAM configuration, this may bypass the setting of
# PasswordAuthentication, PermitEmptyPasswords, and
# "PermitRootLogin without-password". If you just want the PAM account and
# session checks to run without PAM authentication, then enable this but set
# ChallengeResponseAuthentication=no
#UsePAM no
##设置是否通过PAM验证
UsePAM yes
# Accept locale-related environment variables
##AcceptEnv 指定客户端发送的哪些环境变量将会被传递到会话环境中。
###[注意]只有SSH-2协议支持环境变量的传递。指令的值是空格分隔的变量名列表(其中可以使用'*'和'?'作为通配符)。
####也可以使用多个 AcceptEnv 达到同样的目的。需要注意的是,有些环境变量可能会被用于绕过禁止用户使用的环境变量。
#####由于这个原因,该指令应当小心使用。默认是不传递任何环境变量。
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
AllowTcpForwarding yes
##AllowTcpForwarding设置是否允许允许tcp端口转发,保护其他的tcp连接
#GatewayPorts no
##GatewayPorts 设置是否允许远程客户端使用本地主机的端口转发功能,出于安全考虑,建议禁止
#############3.5、X-Window下使用的相关设定###############
#X11Forwarding no
##X11Forwarding 用来设置是否允许X11转发
X11Forwarding yes
#X11DisplayOffset 10
##指定X11 转发的第一个可用的显示区(display)数字。默认值是 10 。
###可以用于防止 sshd 占用了真实的 X11 服务器显示区,从而发生混淆。
X11DisplayOffset 10
#X11UseLocalhost yes
#################3.6、登入后的相关设定#################
#PrintMotd yes
##PrintMotd用来设置sshd是否在用户登录时显示“/etc/motd”中的信息,可以选在在“/etc/motd”中加入警告的信息
#PrintLastLog yes
#PrintLastLog 是否显示上次登录信息
#TCPKeepAlive yes
##TCPKeepAlive 是否持续连接,设置yes可以防止死连接
###一般而言,如果设定这项目的话,那么 SSH Server 会传送 KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
####这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常。在这个情况下,任何一端死掉后, SSH 可以立刻知道,而不会有僵尸程序的发生!
#UseLogin no
##UseLogin 设置是否在交互式会话的登录过程中使用。默认值是"no"。
###如果开启此指令,那么X11Forwarding 将会被禁止,因为login不知道如何处理 xauth cookies 。
####需要注意的是,在SSH底下本来就不接受 login 这个程序的登入,如果指UsePrivilegeSeparation ,那么它将在认证完成后被禁用。
UserLogin no
#UsePrivilegeSeparation yes
##UsePrivilegeSeparation 设置使用者的权限
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
##UseDNS是否使用dns反向解析
#PidFile /var/run/sshd.pid
#MaxStartups 10
##MaxStartups 设置同时允许几个尚未登入的联机,当用户连上ssh但并未输入密码即为所谓的联机,
###在这个联机中,为了保护主机,所以需要设置最大值,预设为10个,而已经建立联机的不计算入内,
####所以一般5个即可,这个设置可以防止恶意对服务器进行连接
#MaxAuthTries 6
##MaxAuthTries 用来设置最大失败尝试登陆次数为6,合理设置辞职,可以防止攻击者穷举登录服务器
#PermitTunnel no
############3.7、开放禁止用户设定############
#AllowUsers<用户名1> <用户名2> <用户名3> ...
##指定允许通过远程访问的用户,多个用户以空格隔开
#AllowGroups<组名1> <组名2> <组名3> ...
##指定允许通过远程访问的组,多个组以空格隔开。当多个用户需要通过ssh登录系统时,可将所有用户加入一个组中。
#DenyUsers<用户名1> <用户名2> <用户名3> ...
##指定禁止通过远程访问的用户,多个用户以空格隔开
#DenyGroups<组名1> <组名2> <组名3> ...
##指定禁止通过远程访问的组,多个组以空格隔开。
# no default banner path
#Banner /some/path
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
ClientAliveInterval 3600
ClientAliveCountMax 0
三、免密登录
3.1 操作原理
基于密码的登陆方式
-
客户端发起ssh请求,服务器会把自己的公钥发送给用户
-
用户会根据服务器发来的公钥对密码进行加密
-
加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥的登陆方式
-
首先在客户端生成一对密钥(ssh-keygen)
-
并将客户端的公钥ssh-copy-id 拷贝到服务端
-
当客户端再次发送一个连接请求,包括ip、用户名
-
服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc
-
服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
-
得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
-
服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
3.2 操作步骤
第一步:客户端生成密钥
第二步:传密钥给服务端
具体实现如下:
客户端IP:192.168.254.20
服务端IP:192.168.254.10
目的:使得客户端访问服务端时,使用密钥方式实现免密登录
1) 生成密钥
ssh-keygen [-t] #生成密钥文件
-t #指定加密方式,不加此则默认使用rsa方式加密
Enter file in which to save the key(/root/.ssh/id_rsa): 直接回车
#选择密钥文件存放的位置 (默认路径)
Enter passphrase (empty for no passphrase):
#对密钥文件进行加密,设置密码后,访问文件需要输入密码
#一般不输入密码 直接回车
Enter same passphrase again:
2) 传递公钥文件至服务器
ssh-copy-id -i 公钥文件 [用户名]@服务器IP
ssh-copy-id -i id_rsa.pub 192.168.254.10
3)测试是否成功免密登录
ssh 192.168.254.10
补充:
若设置了密钥文件的访问密码,可以使用代理来免去每次登陆时输入文件密码
ssh-agent bash #开启代理 ssh-add Enter passphrase for /root/.ssh/id_rsa: #输入密钥文件的密码即可 ssh 192.168.254.10 #免密登录