★ ssh服务的最佳实践: ★
1 不要使用默认端口
2 禁止使用协议版本1
3 限制可登陆多用户,最好做一个白名单
4 设定空闲会话超时时长 (用户连上去无操作多长时间自动端看连接)
5 利用防火墙设置ssh的访问策略,例如仅允许哪些主机访问连接
6 仅监听特定的ip地址 (如果有多个ip,还是内外网,还有vpn,那就仅开通内网远程登录,通过远程vpn,再登录服务器)
7 基于口令认证时,要采用强密码策略 (不低于8位,常换,不用弱口令,各类字符都有)
8 使用基于秘钥的认证
9 禁止使用空口令
10 禁止管理员直接登录
11 限制ssh的访问频度(密码错了几次就断开)和并发在线数
12 做好日志分析,使用awk等做好统计/var/log/secure
ssh protocol ssh协议的版本:
v1:不安全(有些老的程序只支持第一版,所以有时还是要开启)
v2:
Openssh:
sshd :配置文件 /etc/ssh/sshd_config
ssh: 配置文件 /etc/ssh/ssh_config
客户端程序ssh:
ssh
[option] [[email protected]]host [COMMAND]
ssh -l user [option] host [COMMAND]
常用选项:
-l user 指定的用户登录远程主机
-p port 指明远程服务器的端口;为了服务器安全是要修改ssh的端口,
-b bind_ip 把服务绑定在某个ip上面,多ip时可以使用这个选项
-X : 支持x11转发
-Y : 支持信任的X11转发
X:协议,x-windows图形化窗口,也是C/S架构图形为C,主机为S
X11转发的作用:在本地显示远程主机上面的图形窗口,首先本地为X图形界面,或者提供了x server,并不需要远程主机上面有图形界面功能
-o 后面根特定的选项
-o StrictHostKeyChecking=no不做严格的主机登录检查,不输入yes
-t 强制伪tty分配,你想连接的sshd服务器不能一次性到达,需要中间先登录一个sshd服务器,通过跳板机到达
~】# ssh -t remoteserver1 ssh remoteserver2
先连接远程主机1,通过远程主机分配伪终端,跳转到远程主机2
当然在此过程中你要先后输入两次密码了,(你懂得)
省略command则表示为登录这台主机;如果使用命令,则表示临时切换主机执行完指定命令后退出远程的主机
~】# ssh 172.16.1.1 (使用本地登录用户名作为远程登录用户名,并不是root就是默认用户)
~】# ssh [email protected]
~】# ssh -p 20000 172.16.1.5
~】# ssh 172.16.1.1 “shutdown -h now” (关机你就连接不上了^_^)
~】# ssh -o
StrictHostKeyChecking=no 172.16.1.4 第一次远程登录时跳过yes确认远程登录对象
[[email protected] xinetd.d]# ifconfig eth0 | grep "inet addr:" inet addr:172.16.1.2 Bcast:172.16.255.255 Mask:255.255.0.0 [[email protected] [email protected]‘s Last [[email protected] inet 172.16.1.1/16 brd 172.16.255.255 scope [[email protected] 登出 Connection [[email protected] [email protected]‘s inet 172.16.1.1/16 brd 172.16.255.255 scope |
接收的所有认可的服务器列表:~/.ssh/known_hosts 一个一行
ssh的配置文档/etc/ssh/ssh_config 修改文件则以后会成为默认
OPTION1
VALUE
#开头的是默认的
vim /etc/ssh/ssh_config
StrictHostKeyChecking no 以后登录远程主机不在第一次输入yes,采用非严格的远程登录
ssh主机认证:需要用到主机认证秘钥,此秘钥由服务器端维护和提供
ssh支持的用户认证:
基于口令的认证:用户输入账号和密码
基于秘钥的认证:用户提供一对密钥,私钥保留在客户端,公钥保存在远程服务器端
ssh基于秘钥的认证
ssh-keygen [-q] [-b bits] -t type [-f output_keyfile]
-q |
静默模式 |
-b |
秘钥位数,512,1024,2048,4096,默认2048 |
-t |
指明秘钥格式rsa,dsa,ecdsa椭圆曲线算法,最好使用rsa或者ecdsa |
-f |
保存到哪个文件当中 默认在~/.ssh目录下 |
-P |
指明对私钥加密的密码 |
-v |
调试模式 |
-C |
压缩方式 |
-X |
只是X11转发 |
-Y |
只是信任X11转发 |
~】# ssh-keygen -t ecdsa 会在~/.ssh目录下生成id_ecdsa私钥和id_ecdsa.pub一对
~】# ssh-keygen -t rsa -P
‘‘ 指明私钥密码为空密码,则会跳过让你指定私钥密码环节
注:每个用户的一对私钥和公钥是可以重复使用的,不用每次都执行一次创建一对秘钥,不然会覆盖原有的私钥和公钥,尤其是你已经开始使用了,如果还想链接更多台的服务器,直接使用已存在的公钥传输给其他用户
[[email protected] ~]# ssh-keygen -t rsa Generating Enter Enter passphrase (empty for no passphrase): 这个位置是输入私钥的加密密码(以后你安装的时候 Enter same passphrase again: Your Your The key aa:a1:93:52:ca:12:82:64:13:7c:c9:0c:df:b5:f3:50 The +--[ |..+ +-----------------+ |
在本地主机,将公钥复制到要登录的远程主机的某用户的家目录下的~/.ssh/authorized_keys 文件中(有特定命令)
ssh-copy-id [-i [identity_file]] [[email protected]]machine
~】# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
~】# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] /usr/bin/ssh-copy-id: /usr/bin/ssh-copy-id: [email protected]‘s Number Now try and [[email protected] ~]# ssh 172.16.1.2 这个时候是不需输入远程用户密码 Enter passphrase for key ‘/root/.ssh/id_rsa‘: 如果每有给私钥文件加密,那么直接可以登录成功 Last |
之后在远程服务器上会在相应用户家目录下面的.ssh目录里面有一个authorized_keys文件
aushorized_keys文件可以存放一到多个远程公钥登录的公钥,一行一个(每行都很长所以在你看来占据了很多行),所以不要随便删除这个文件
[[email protected] .ssh]# cat authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCpAJFy7QTadK0ghnq63+BZ7Qzm5FLZ4XeVyb1kNwis6GkfyltnX2fzaeR5nLTM6uWHacfahin6Khy9nPX02jDFNMBYGUHg6NXHQLdGihYxv20j1zv4aZRlIPicuqktDM+c2Nda6Yzufun52gQvEzr9HELKMMIkEn6rs4GrY6TO2rG3mV5e8TM++MoV8i+8VZOfKK+I5buEHvBaz+oaQ7Y++WOcuOHir8Nn/wOoOZYrHAa7+qtPKYtEmUmT1eHqnJzdt2lpB0HZNIUuRikSVCCdI6QLmLb7E5xyuZmNB8F6owyenrGmyaerB2whKqoUMHjxCQt8ipr/yOfd/wK5BJV 这是在远程服务器上的 一个本地登录的登录公钥,因为我这只设置了一个,所以只有这一个,一个,看起来很多行 |
----------------------
*********************
----------------------
SSH端口转发
v什么是SSH端口转发?
SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP
端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP
链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP
应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH
的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯
vSSH 端口转发能够提供两大功能:
加密SSH Client 端至SSH Server 端之间的通讯数据
突破防火墙的限制完成一些之前无法建立的TCP 连接。
v本地转发:
格式:-L localport:host:hostportsshserver
~】# ssh –L 9527:server1:23 -fN server2
本地端口:远程主机:远程主机端口
-N 后制定跳板机
~】#telnet 127.0.0.1 9527
当访问本机的9527的端口时,被加密后转发到server2的ssh服务,再解密被转发到server1:23
dataàlocalhost:9527 àlocalhost:XXXXXàserver2:22àserver2:YYYYY àserver1:23
这里server2为跳板机
v选项:
-f 后台启用
-N 不开远程shell,一般是与-f搭配使用的
-g 启用网关功能
上图的步骤操作完成之后,会在后台打开这个隧道,当我们使用服务的时候就可以使用了:
~】# telnet 127.0.0.1 9527 在本地虽然是连接本地的端口,但是刚才我们已经开启了端口转发,有数据在这个端口走,就会通过ssh刚建立的隧道,传输到跳板机,跳板机再去帮你找服务
这样一个明文的telnet被封装到ssh协议里面,变得安全起来
v远程转发:
格式:-R sshserverport:host:hostportsshserver
~】# ssh–R 4000:server1:23 –N server2
让跳板机远程连接8023端口,家庭本地主机侦听8023端口的访问,如有访问,就加密后转发请求到家庭本机sshd服务,再由跳板机解密后转发到serve1:23
Dataàlocalhost:8023àlocalhos:22àserver2:XXXàserver2:YYYàserver1:23
localhost 为家庭本地主机,server2为跳板机
注:远程主机和本机主机两种端口转发虽然最后达到的效果一样,但是贼在数据流向和端口之间的切换有很大不同
SSH动态端口转发:
v需要配置动态端口的情况
当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet
在本机firefox设置代理proxy:127.0.0.1:1080
格式:
~】# ssh -D 1080 [email protected]
scp命令: 与cp命令相似 基于ssh连接完成复制,跨主机加密以后完成数据传输
文件:
远程为目录,则复制到目录中,创建同名文件
远程为目录,且文件存在,覆盖
远程为文件,则覆盖
目录: 复制目录必须使用-r选项
远程为目录,则复制到这个目录当中,新建一个同名目录
远程为文件,不被允许
远程为非存在目录,则复制过去,之后重命名
存在两种情形:
PULL : scp
[options] [[email protected]]host:/path/to/somefile
/path/to/somefile
源文件是远程的,目标文件是本地的,用远程主机上拽文件过来,要求指定用户对远程主机文件有读权限
PUSH: scp [options]
/path/to/somefile [[email protected]]host:/path/to/somefile
源文件是本地的,目标文件是远程的,把文件推送动远程主机,要求指定用户对远程主机文件有写权限
rsync 命令 (因为cp只能是每次都要拷贝一次,在增量备份当中显得低效)
rsync就是通过ssh协议封装了sync,基于ssh和rsh服务实现高效率的远程系统之间复制文件
使用安全的shll连接作为传输方式,比scp更快,只复制不同的文件
~】# rsync -av /etc server1:/tmp 复制目录和目录下文件
~】# rsync -av /etc/ server1:/tmp 只复制目录下的文件 ,所以看好了后面有没有/
~】# rsync -avz --delete /etc server1:/tmp 当/etc下面文件发生增删查改,再执行这条命令,远程同步主机的/tmp目录也会发生变化,结合crond可以实现数据同步
-n |
模拟复制过程 |
-v |
显示详细过程 |
-r | 递归复制目录树 |
-p |
保留权限 |
-t |
保留时间戳 |
-g | 保留组信息 |
-o |
保留所有者信息 |
-l |
把符号链接文件做为符号文件进行复制 |
-L | 将软链接文件指向文件复制 |
-a |
存档模式,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X),同步所有 |
z | 压缩 |
sftp命令: (openssh 自带的一个组件)
ftp: file transfer protocol 明文传输
安全的文件传输机制:
ftps: ftp over ssl
sftp: ftp over
ssh
sftp: C/S架构
S:由sshd服务进程管理,是sshd的一个子系统,在centos系统上的openssh上为默认启动状态,所以默认不用配置
C:即sftp
连接至远程主机:
~】# ftp [email protected]
ftp>
help
ftp> get
file_name /tmp 后者的/tmp是本地的目录,意为下载某文件到本地/tmp目录
ftp> !COMMAND 加上!表示命令作用于本地主机,而不是远程主机
[[email protected] mnt]# sftp [email protected]:/boot Connecting [email protected]‘s password: 在这里需要输入密码,如果做过ssh公钥认证,则直接跳过此步骤 Changing sftp> ls ......省略 grub grub2 sftp> cd / 可以任意切换远程主机上面的任意位置,只要你远程登录的用户有足够的权限 sftp> bin boot run sbin |
sshd (服务器端)
配置目录/etc/ssh目录
ssh_host_key ssh_host_key.pub
ssh_host_dsa_key ssh_host_dsa_key.pub
ssh_host_rsa_key ssh_host_rsa_key.pub
这6个密钥文件是用于实现主机认证
配置文件: /etc/ssh/sshd_config 操作前请备份
#空格开头的为纯注释
格式: 配置指令 值
port |
端口,默认位22 |
AddressFamily |
地址家族,监听ipv4或者ipv6 |
SyslogFacility | 系统日志 |
LoginGraceTime |
用户登录的等待时期,最多2分钟,2分钟不登录,自动断开连接 |
MaxAuthTries |
输入密码错误最多几次,默认6,但6要除以2,也就是3次,2还是2,1就是1,4还是2降低辞职避免暴力破解 |
ListenAddress |
指定监听的ip,默认为0.0.0.0,监听所有主机 |
Protocol |
定义协议版本,默认为2(1.2版本) |
LogLevel |
日志级别 |
PermitRootLogin |
是否允许root用户直接远程登录;可以给关闭,之后用普通用户远程登录,之后su进来,之后使用root用户 |
MaxSessions |
最大会话数量,默认10,最多可以有10个终端同时远程登录 |
RSAAuthentication | 默认为yes ,是否支持rsa的认证机制,指的基于公钥的用户认证,默认支持 |
PubkeyAuthentication |
默认为yes,支持基于公钥的认证,它和上面的指令需要同时打开,才能生效 |
AuthorizedKeysFile |
基于远程基于公钥认证的公钥存放的文件路径,默认~/.ssh/authorized_keys |
RhostsRSAAuthentication | 默认为no,与远程主机连接必须做RSA认证,一般我们远程连接主机,如果以前从没有通信过,远程主机会先发送一个它的一个密钥(它的公钥)给主机,我们需要通过yes后同意接受。如果把值改为yes,如果本地主机事先没有这个密钥,就无法建立连接,因此非常安全。我们可以先建立连接,等本地known_hosts文件记录了远程主机的公钥之后,我们再打开这项功能。也可以把这个公钥放到加密狗上面随身携带,这项功能安全,但是也意为这麻烦,秘钥没了你就要去机房了 |
PasswordAuthentication |
默认为yes,是否允许基于口令远程登录,如果开启基于密钥认证,则建议关闭 |
UsePAM |
默认为yes,基于PAM模块认证,系统认证功能必然会用到的机制 |
AcceptEnv |
默认为yes,基于PAM模块认证,系统认证功能必然会用到的机制 |
X11Forwarding | 默认yes,是否允许X11协议做转发 |
PrintMotd | 默认为yes,是否在用户登录时打印Motd信息, 对应/etc/motd文件 |
PrintLastLog |
默认为yes,是否显示用户上一次在几点几分通过什么终端登录,这样会泄露你的登录信息,建议关闭,反正你也知道你上次大概什么时候登录的,让别人看到反而不好 |
UseDNS |
默认为yes,是不是每次登录的时候,都基于DNS反解对方的地址到主机名,建议改为no,因为有的时候因为网络问题,你可能会卡在远程登录那一会才能登进系统 |
Subsystem | 子系统,运用程序为/usr/libexec/openssh/sftp-server |
StrictModes |
是否检查家目录相关文件权限是否正确,ssh远程时使用的文件 |
GatewayPort |
支持端口转发 |
ClientAliveInterval |
0永远不动,用户连接上,多长时间不动断开连接 |
ClientAliveCountMax |
会话最大连接数 |
PermitTunnel |
允许隧道,涉及到端口准发,可以开启这个选项,如果你要设置的话 |
Banner |
指定自定义/etc/ssh.txt文件,之后用户ssh远程登录的时候会打印文件里面的内容 |
以上是配置文件中常用的,还有写没有写在配置文件中的可以man 文件手册
~】# man sshd_config 查看服务配置文档的帮助文档
~】# man ssh_config
~】# man sshd 查看sshd怎么使用
修改完配置文档,要想生效,需要reload一下
~】# service sshd reload
6版本上: 服务脚本 --> /etc/rc.d/init.d/sshd
7版本上:Systemd Unit File --->
/usr/lib/systemd/system/sshd.service
~】# systemctl reload sshd
限制可远程登录的用户
~】# vim /etc/ssh/sshd_config
写入
AllowUsers user1 user2 user3 空格隔开
Allowgroups
group1
这是白名单
DenyUsers
user1 user2
DenyGroups
group1
这是黑名单
黑名单和白名单只能使用一个,如果同时使用那就拒绝大于允许
补充: 如果修改了sshd的端口,同时你开启了防火墙和selinux的话,首先要调整防火墙策略,改个端口,删了以前那条就行
对于selinux:
~ 】# tail
/var/log/messages 查看selinux的日志
~ 】# sealert -l
15d342-54ef-8982dfc6e0 这是根据日志提醒操作的
~ 】# semanage port -a -t
ssh_port_t -p tcp 20000 这是其上命令建议的操作
~ 】# semange port -l | grep
ssh 查看是否添加端口成功
ssh 协议的另一个实现:dropbear
轻量化实现,多用户嵌入式方案当中,使用机制和openssh大致相同 (在无线路由器上就是这样允许远程登录的)
~】# yum install dropbear
-y (epel源里面有)
配置目录:/etc/dropbear
服务端程序:/usr/sbin/dropbear
客户端程序:/usr/bin/dbclient
为dropbear生成主机秘钥:/usr/bin/dropbearkey
~】# dropbearkey -t rsa -s 2048
-f /etc/dropbear/dropbear_rsa_host_key
~】# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key (因为dss只支持1024位,所以不用指定)
~】# dropbearkey -t ecdsa -s 521
-f /etc/dropbear/dropbear_ecdsa_host_key (椭圆曲线,最长支持521位)
~】# dropbear -p 20000 -E
-F
-E 为把标准输出从执行日志改为错误输出,这样信息就会显示在终端上
-F 前台运行,测试的时候使用这两项,平时打开,不用
-p 指定开启服务使用的端口,默认是22,但是这个和ssh冲突,测试需要修改,或者停sshd
另一台主机登录测试:
~】# ssh -p 20000 172.16.1.1
~】# dbclient-p 20000 172.16.1.1
如果测试都没有问题,可以开启服务了systectl命令开启此服务,但是因为不想使用默认端口22,我们需要
~】# cat
/usr/lib/systemd/system/dropbear.service
EnvironmentFile=-/etc/sysconfig/dropbear
ExecStart=/usr/sbin/dropbear -E -F $OPTIONS
这两行的意思就是开启的时候,会调用/etc/sysconfig/dropbear文件里面的OPTIONS参数
~】# vim
/etc/sysconfig/dropbear 文件为空
写入
OPTIONS=“-p 20000”
~】# systectl start dropber.service
~】# ss -tnl 显示20000端口是否监听
这里演示一下我们测试dropbear能够服务可以使用
首先我们要在服务端先建立好钥匙
[[email protected] xinetd.d]# dropbearkey -t rsa -s 2048 -f /etc/dropbear/dropbear_rsa_host_key Generating Public ssh-rsa ....中间秘钥省略..... [email protected] Fingerprint: |
在这个时候我们就可以开启服务,远程登录可以通过rsa加密算法,但是为了更好的支持远程登录可以开启更多登录;
这个时候开启服务的话是可以用的,但是会报错,所另外两个算法的文件没有找见,但是远程登录是可以成功的
[[email protected] xinetd.d]# dropbear -p 20000 -E -F [4518] [4518] [4518] |
当然为了安全我们只是用一个远程登录的方式也是可以的
所以下面的步骤是可以省略的
[[email protected] xinetd.d]# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key Generating Public ssh-dss Fingerprint: [[email protected] |
不管是开启一个加密算法,还是3个都开启,我们这个时候可以开启dropbear服务了,当然建议暂时关闭防火墙
[[email protected] xinetd.d]# dropbear -p 20000 -E -F [4523] |
在本地客户端试图连接远程服务
[[email protected] ssh]# ssh -p 20000 172.16.1.1 The RSA key Are you Warning: [email protected]‘s |
或者通过dbclint连接
[[email protected] ssh]# dbclient -p 20000 172.16.1.1 Host (ssh-rsa Do you [email protected]‘s |
我们可以查看ip,是否已经远程登录成功,我这里本地为6,远程为7,能使用ip addr就说明ok了
[[email protected] ~]# ip addr show eno16777736 | grep ‘inet\b‘ inet 172.16.1.1/16 brd 172.16.255.255 scope |
我们在测试的 服务器端,因为我们开启了测试的前台显示,和输出为错误输出到终端,我们可以看到连接状况
[[email protected] xinetd.d]# dropbear -p 20000 -E -F [4523] [4550] [4550] |
当本地客户端断开连接的时候就会显示
[4583] Jun 30 11:07:04 Exit (root): Disconnect received |
编译安装dropbear
v2、ftp://172.16.0.1/pub/Sources/sources/dropbear/dropbear-2013.58.tar.bz2 (马哥内网服务器)
v3、tar xf dropbear-2013.58.tar.bz2,
v4、less INSTALL 或者cat INSTALL 查看安装帮助信息
v5、./configure
v6、make PROGRAMS=‘dropbear scp dropbearkey
dbclient‘ 这里注意一下,如果有ssh有scp,这里的的scp就别安装了
v7、make PROGRAMS=‘dropbear scp dropbearkey
dbclient‘ install
v8、ls /usr/local/sbin/ /usr/local/bin/
v9、/usr/local/sbin/dropbear -h
v10、mkdir /etc/dropbear
v11、dropbearkey -t rsa -f
/etc/dropbear/dropbear_rsa_host_key -s 2048
v12、dropbearkey -t dss -f
/etc/dropbear/dropbear_dsa_host_key
v13、dropbear -p :2222 -F -E ; ss –tnl #前台运行,信息终端错误输出(测试用,正常启用的话,不用加-F和-E)
v14、ssh -p 2222 [email protected]
v15、dropbear -p :2222 #后台运行 (这是后台执行,测试成功就要执行这个,或者直接执行,不测试)
v16、dbclient -p 2222 [email protected]