安全的SSH连接
方式
- 端口
- 协议
- 用户
- 密码
- 密钥对
ssh-agent
- 二次认证
#设置ssh监听的端口号,默认22端口
Port 22#指定监听的地址,默认监听所有;
ListenAddress ::
ListenAddress 0.0.0.0 #指定支持的SSH协议的版本号。'1'和'2'表示仅仅支持SSH-1和SSH-2协议。
#"2,1"表示同时支持SSH-1和SSH-2协议。#
Protocol 2,1#HostKey是主机私钥文件的存放位置;
"rsa1"仅用于SSH-1,"dsa"和"rsa"仅用于SSH-2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key#密钥路径
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key#是否通过创建非特权子进程处理接入请求的方法来进行权
#限分 离。默认值是"yes"。 认证成功后,将以该认证用户的身份创另一个子进程。这样做的目的是
#为了防止通过有缺陷的子进程提升权限,从而使系统更加安全。
UsePrivilegeSeparation yes#在SSH-1协议下,短命的服务器密钥将以此指令设置的时
#间为周期(秒),不断重新生成;这个机制可以尽量减小密钥丢失或者黑客攻击造成的损失。设为 0
#表示永不重新生成为 3600(秒)。
KeyRegenerationInterval 3600#指定服务器密钥的位数
ServerKeyBits 1024#指定 将日志消息通过哪个日志子系统(facility)发送。有效值是:
#DAEMON, USER, AUTH(默认), LOCAL0, LOCAL1, LOCAL2, LOCAL3,LOCAL4, LOCAL5,
#LOCAL6, LOCAL7
SyslogFacility AUTH#指定日志等级(详细程度)。可用值如下:QUIET, FATAL, ERROR, INFO
#(默认), VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3,DEBUG 与 DEBUG1 等价;DEBUG2,# 和 DEBUG3 则分别指定了更详细、更罗嗦的日志输出。比 DEBUG 更详细的日志可能会泄漏用户
# 的敏感信息,因此反对使用。
LogLevel INFO#限制登陆时间120秒,0表示无限制,登陆失败需等待120s
LoginGraceTime 120#是否允许 root 登录
#"no"表示禁止。"without-password"
#表示禁止使用密码认证登录。"forced-commands-only"
#表示只有在指定了 command 选项的情况下才允许使用公钥认证登录,同时其它认证方法全部被禁止。
#这个值常用于做远程备份之类的事情。
PermitRootLogin yes可用值如下:"yes"(默认) 表示允许。#指定是否要求 sshd(8) 在接受连接请求前对用户主目录和相关的配
#置文件 进行宿主和权限检查。强烈建议使用默认值"yes"来预防可能出现的低级错误。
StrictModes yes#是否允许使用纯 RSA 公钥认证。仅用于SSH-1。默认值是"yes"。
RSAAuthentication yes#是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"。
PubkeyAuthentication yes#是否取消使用 ~/.ssh/.rhosts 来做为认证。推荐设为yes。
IgnoreRhosts yes#这个选项是专门给 version 1 用的,使用 rhosts 档案在/etc/hosts.equiv配合 RSA 演算方式来进行认证!推荐no。
RhostsRSAAuthentication no#这个与上面的项目类似,不过是给 version 2 使用的
HostbasedAuthentication no#是否在 RhostsRSAAuthentication 或HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件。默认值是"no"。为了提高安全性,可以设为"yes"。
IgnoreUserKnownHosts no#是否允许密码为空的用户远程登录。默认为"no"。
PermitEmptyPasswords no#是否允许质疑-应答(challenge-response)认
#证。默认值是"yes",所有 login.conf中允许的认证方式都被支持。
ChallengeResponseAuthentication no# 是否允许使用基于密码的认证。默认为"yes"。
PasswordAuthentication yes#是否要求用户为 PasswordAuthentication 提供的密码必须通 过 Kerberos KDC 认证,也就是是否使用Kerberos认证。使用Kerberos认证,服务器需要一个可以校验 KDC identity 的 Kerberos servtab 。默认值是"no"。
KerberosAuthentication no#如果使用了 AFS 并且该用户有一个 Kerberos 5 TGT,那么开启该指令后,将会在访问用户的家目录前尝试获取一个 AFStoken 。默认为"no"。
KerberosGetAFSToken no#如果 Kerberos 密码认证失败,那么该密码还将要通过其它的 认证机制(比如 /etc/passwd)。默认值为"yes"。
KerberosOrLocalPasswd yes#是否在用户退出登录后自动销毁用户的 ticket 。默认"yes"
KerberosTicketCleanup yes#是否允许使用基于 GSSAPI 的用户认证。默认值为"no"。仅用 于SSH-2
GSSAPIAuthentication no。#是否在用户退出登录后自动销毁用户凭证缓存。默认值是"yes"。仅用于SSH-2。
GSSAPICleanupCredentials yes#是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。如果
#允许X11转发并且sshd代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。
#那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。需
#要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。如
#果启用了 UseLogin ,那么X11转发将被自动禁止。
X11Forwarding no#指定X11 转发的第一个可用的显示区(display)数字。默认值是 10 。这个可以用于防止 sshd 占用了真实的 X11 服务器显示区,从而发生混淆。
X11DisplayOffset 10#登陆信息显示例如上次登入的时间、地点等等,预设是 yes ,但是,如果为了安全,可以考虑改为 no !
PrintMotd no#指定是否显示最后一位用户的登录时间。默认值是"yes"
PrintLastLog yes#指定系统是否向客户端发送 TCP keepalive 消息。默认值是"yes"这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常。可以设为"no"关闭这个特性。
TCPKeepAlive yes#是否在交互式会话的登录过程中使用 login。默认值是"no"。#如果开启此指令,那么 X11Forwarding 将会被禁止,因为 login 不知道如何处理 xauth
#cookies 。需要注意的是,login是禁止用于远程执行命令的。如果指定了
#UsePrivilegeSeparation ,那么它将在认证完成后被禁用。
UseLogin no#最大允许保持多少个未认证的连接。默认值是 10 。到达限制后,#将不再接受新连接,除非先前的连接认证成功或超出 LoginGraceTime 的限制。
MaxStartups 10#指定每个连接最大允许的认证次数。默认值是 6 。如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息。
MaxAuthTries 6#指定是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。
UseDNS no#将这个指令指定的文件中的内容在用户进行认证前显示给远程用户。这个特性仅能用于SSH-2,默认什么内容也不显示。"none"表示禁用这个特性。
Banner /etc/issue.net
Subsystem sftp /usr/lib/openssh/sftp-server#配置一个外部子系统(例如,一个文件
#传输守护进程)。仅用于SSH-2协议。值是一个子系统的名字和对应的命令行(含选项和参数)。
#是否使用PAM模块认证
UsePAM yes
过程
#centso
#编辑ssh配置文件
vim /etc/ssh/sshd_config#RedHat-还需要
#没有安装的话需要先安装
yum install policycoreutils-python
# 添加端口
semanage port -a -t ssh_port_t -p tcp 10254
# 验证是否添加成功
semanage port -l | grep ssh #Debian系的系统中直接修改端口就可
#修改端口
Port 10254
#SSH2协议要比SSH1安全,如果没有就末尾添加,远程连接(需要ssh -2 username@ip)
Protocol 2
#超时断开
# 以秒为单位,超过60s未操作自动断开
ClientAliveInterval 60
# 如果客户端没有响应则判断一次超时,该参数设置允许超时的次数
ClientAliveCountMax 0
#禁止root用户
PermitRootLogin no
#指定用户登陆
AllowUsers uesr
#禁用特定用户登录
DenyUser testuser
#是否允许(空密码)登陆
PermitEmptyPasswords no
#是否运行密码的登陆方式,设置为no,需要公钥密钥
PasswordAuthentication no
#最大错误次数,默认最多允许3次密码错误(需要除2)修改为2则表示若密码输入错误一次即断开。
MaxAuthTries 6
#主动断开会话(秒/分钟)-LoginGraceTime 2m/2s
LoginGraceTime 120
#详细日志
LogLevel VERBOSE
小贴士:
#同权限账号
useradd aa
passwd aa
vim /etc/sudoers
文章图片
#重启服务
systemctl restart sshd
密钥对
生成密钥对 上面已经设置了不能使用密码登录,那么,换句话说需要使用密钥登录,生成密钥并不难:
ssh-keygen -t rsa
只需要指定算法即可,默认为
3072
位,可选4096
位。但是,相比起传统的
RSA
,在OpenSSH 6.5
中引入了另一种叫Ed25519
的更加安全的算法,使用椭圆曲线进行加密。Ed25519
相比起RSA
的优点有:- 体积更小:相比起
RSA 3072
的544
个字符,Ed25519
只有68
个字符 - 更快:生成速度比
RSA
快,同时签名速度也比RSA
快 - 更安全:签名过程不依赖随机数生成器,不依赖哈希函数的防碰撞特性,没有时间通道攻击的问题
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/ed25519
参数说明如下:
-a
:指定KDF
(Key Derivation Function
)的轮数-t
:指定算法,可选dsa
、ecdsa
、ecdsa-sk
、ed25519
、ed25519-sk
、rsa
-f
:指定位置
ssh-copy-id -i ~/.ssh/ed25519.pub user@ip
私钥密码 比如按上述方式生成密钥对时,会提示输入私钥密码:
文章图片
这里的密码会在使用私钥连接的时候提示:
文章图片
配合
ssh-add
默认情况下每次使用私钥登录的时候都需要输入私钥的密码,如果不想每次输出,可以使用ssh-add
:ssh-add ~/.ssh/test # ~/.ssh/test替换成对应的私钥路径
这样只需要输入一次私钥密码,下一次连接的时候就不需要输入私钥密码连接了。
使用不同密钥对 假设您有多台服务器:
server1
,server2
,server3
,则可以为不同服务器使用不同的密钥对,而不是使用同一个密钥对:ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server1
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server2
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server3
接着复制公钥到对应的服务器上:
ssh-copy-id user@server1 -i ~/.ssh/server1.pub
ssh-copy-id user@server2 -i ~/.ssh/server2.pub
ssh-copy-id user@server3 -i ~/.ssh/server3.pub
ssh-agent
这是什么?
ssh-agent
是一个程序,可以帮助管理私钥。代理能提供如下用途:- 自动选择密钥:使用不同密钥连接到不同主机时,需要手动指定密钥(比如上面的
使用不同密钥对
的例子中,连接到不同服务器时需要加上-i
参数),ssh-agent
可以自动选择,不需要手动指定 - 自动输入私钥密码:如果私钥设置了密钥(比如上面的
私钥密码
例子),但是又需要频繁地使用私钥进行认证时,ssh-agent
可以帮助自动输入私钥的密码
首先启动:
eval `ssh-agent` # 注意是反引号
接着添加私钥:
# 以上面“使用不同的密钥对”为例
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1
这样连接的时候就不需要手动指定
-i
参数了。如果私钥指定了密码,会在
ssh-add
时进行提示输入:文章图片
这样下次使用带密钥的私钥连接时就不需要输入密码了。
二次认证
Two-Factor Authentication
,缩写2FA
,意为双重认证
,双因子认证
等等,顾名思义就是进行两步认证的操作,可选的应用有:Google Authenticator
Authy
Yubico
Duo
Google Authenticator
,安装之后,连接服务器需要进行输入验证码的操作。【服务器安全设置】具体的话就不演示了,因为笔者需要经常连接,因此这个选项对笔者来说不太实际,想要实现的话具体可以参考这里。
(2FA)
双重认证(英语:Two-factor authentication,缩写为2FA),又译为双重验证、双因子认证、双因素认证、二元认证,又称两步骤验证(2-Step Verification,又译两步验证),是一种认证方法,使用两种不同的元素,合并在一起,来确认用户的身份,是多因素验证中的一个特例。
案例
密钥对登陆
Xshell配置密钥公钥(Public key)与私钥(Private Key)登录
ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法。
使用密钥登录分为3步:
1、生成密钥(公钥与私钥);
2、放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中;
3、配置ssh客户端使用密钥登录。
一、生成密钥公钥(Public key)与私钥(Private Key) 打开Xshell,在菜单栏点击“tools”,在弹出的菜单中选择“User Key Generation Wizard...”(密钥生成向导),如下图:
文章图片
弹出“User Key Generation Wizard”对话框,在“Key Type”项选择“RSA”公钥加密算法,“Key Length”选择为“2048”位密钥长度,如下图:
文章图片
点击“Next”,等待密钥生成:
文章图片
继续下一步,在“Key Name”中输入Key的文件名称,我这里为“key”;在“Passphrase”处输入一个密码用于加密私钥(密码任意输入),并再次输入密码确认,如下图:
文章图片
点击“Next”,密钥生成完毕(Public key Format选择SSH2-OpenSSH格式),这里显示的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到文件,如下图。私钥这里不显示,可以在“User Key Mangager...”导出到文件:
文章图片
点击“Save as file...”按钮,将公钥(Public key)保存到磁盘,文件名为“key.pub”,备用。
二、上传公钥(Public Key)到服务器: 使用到Xshell登录到服务器,进入到“/root/.ssh/”目录,运行rz命令(如果没有rz命令,运行yum install lrzsz安装),将key.pub发送到服务器,然后运行如下命令,将公钥(Public Key)导入到“authorized_keys”文件:
#上传公钥并且写入
cat key.pub >> authorized_keys
#赋权限
chmod 600 authorized_keys
三、配置Xshell使用密钥认证方式登录到服务器: 打开Xshell,点击“New”按钮,弹出“New Session Properties”对话框,在“Connection”栏目中,输入刚刚配置好公钥(Public Key)的IP地址和端口,如下图所示:
文章图片
推荐阅读
- ssh|Hibernate01 - 入门概念 搭建环境 api
- ssh|Hibernate03 -查询方式 OID hql QBC
- html|#新闻拍一拍# 科学家创造网速新巅峰(每秒 178 Tb | Linux 中国)
- Linux|关于iptables
- java|struts2.3.4.1+hibernate3.6.5+spring3.1.2配置
- ssh|jar作用(一)
- ssh|Struts 2 JFreeChart 插件使用官方文档中文版
- apache的dbcp数据库连接池
- ssh|properties文件的Eclipse插件(plugin)