SSH LINUX Security Settings

SSH 配置安全控制限制登录

1. 只允许某个IP登录,拒绝其他所有IP

在 /etc/hosts.allow 增加:

1
sshd: 1.2.3.4

在 /etc/hosts.deny 增肌:

1
sshd: ALL

用 iptables 也行:

1
2
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT

2. 禁止某个用户通过ssh登录

在/etc/ssh/sshd_conf添加

1
2
3
4
5
AllowUsers 用户名
或者
AllowGroups 组名
或者
DenyUsers 用户名

3. 设定登录黑名单
1
2
3
[root@6 ~]# vim /etc/pam.d/sshd
auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/sshd_user_deny_list onerr=succeed
# 所有/etc/sshd_user_deny_list里面的用户被拒绝ssh登录
4. sshd_config配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# 关于 SSH Server 的整体设定,包含使用的 port 啦,以及使用的密码演算方式
Port 22          # SSH 预设使用 22 这个 port,您也可以使用多的 port
              # 亦即重复使用 port 这个设定项目即可!
Protocol 2,1        # 选择的 SSH 协议版本,可以是 1 也可以是 2 ,
              # 如果要同时支持两者,就必须要使用 2,1 这个分隔了!
#ListenAddress 0.0.0.0   # 监听的主机适配卡!举个例子来说,如果您有两个 IP,
              # 分别是 192.168.0.100 及 192.168.2.20 ,那么只想要
              # 开放 192.168.0.100 时,就可以写如同下面的样式:
ListenAddress 192.168.0.100 # 只监听来自 192.168.0.100 这个 IP 的SSH联机。
                   # 如果不使用设定的话,则预设所有接口均接受 SSH
PidFile /var/run/sshd.pid      # 可以放置 SSHD 这个 PID 的档案!左列为默认值
LoginGraceTime 600     # 当使用者连上 SSH server 之后,会出现输入密码的画面,
              # 在该画面中,在多久时间内没有成功连上 SSH server
              # 就断线!时间为秒!
Compression yes      # 是否可以使用压缩指令?当然可以啰!

# 说明主机的 Private Key 放置的档案,预设使用下面的档案即可!
HostKey /etc/ssh/ssh_host_key    # SSH version 1 使用的私钥
HostKey /etc/ssh/ssh_host_rsa_key  # SSH version 2 使用的 RSA 私钥
HostKey /etc/ssh/ssh_host_dsa_key  # SSH version 2 使用的 DSA 私钥
# 关于 version 1 的一些设定!
KeyRegenerationInterval 3600     # 由前面联机的说明可以知道, version 1 会使用
                   # server 的 Public Key ,那么如果这个 Public
                   # Key 被偷的话,岂不完蛋?所以需要每隔一段时间
                   # 来重新建立一次!这里的时间为秒!
ServerKeyBits 768           # 没错!这个就是 Server key 的长度!

# 关于登录文件的讯息数据放置与 daemon 的名称!
SyslogFacility AUTH         # 当有人使用 SSH 登入系统的时候,SSH会记录资
                   # 讯,这个信息要记录在什么 daemon name 底下?
                   # 预设是以 AUTH 来设定的,即是 /var/log/secure
                   # 里面!什么?忘记了!回到 Linux 基础去翻一下
                   # 其它可用的 daemon name 为:DAEMON,USER,AUTH,
                   # LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,
LogLevel INFO            # 登录记录的等级!嘿嘿!任何讯息!
                   # 同样的,忘记了就回去参考!

# 登入设定部分
PermitRootLogin no     # 是否允许 root 登入!预设是允许的,但是建议设定成 no
UserLogin no        # 在 SSH 底下本来就不接受 login 这个程序的登入!
StrictModes yes      # 当使用者的 host key 改变之后,Server 就不接受联机,
              # 可以抵挡部分的木马程序!
#RSAAuthentication yes   # 是否使用纯的 RSA 认证!?仅针对 version 1 !
PubkeyAuthentication yes  # 是否允许 Public Key ?当然允许啦!只有 version 2
AuthorizedKeysFile .ssh/authorized_keys
              # 上面这个在设定若要使用不需要密码登入的账号时,那么那个
              # 账号的存放档案所在档名!
Allowusers root@222.XX.XX.XX. #设置允许root帐号只能以222.XX.XX.XX这个IP进行ssh连接

# 认证部分
RhostsAuthentication no  # 本机系统不止使用 .rhosts ,因为仅使用 .rhosts 太
              # 不安全了,所以这里一定要设定为 no
IgnoreRhosts yes      # 是否取消使用 ~/.ssh/.rhosts 来做为认证!当然是!
RhostsRSAAuthentication no # 这个选项是专门给 version 1 用的,使用 rhosts 档案在
              # /etc/hosts.equiv配合 RSA 演算方式来进行认证!不要使用
HostbasedAuthentication no # 这个项目与上面的项目类似,不过是给 version 2 使用的!
IgnoreUserKnownHosts no  # 是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录
              # 的主机内容?当然不要忽略,所以这里就是 no 啦!
PasswordAuthentication yes # 密码验证当然是需要的!所以这里写 yes 啰!
PermitEmptyPasswords no  # 若上面那一项如果设定为 yes 的话,这一项就最好设定
              # 为 no ,这个项目在是否允许以空的密码登入!当然不许!
ChallengeResponseAuthentication yes # 挑战任何的密码认证!所以,任何 login.conf
                   # 规定的认证方式,均可适用!
#PAMAuthenticationViaKbdInt yes # 是否启用其它的 PAM 模块!启用这个模块将会
                   # 导致 PasswordAuthentication 设定失效!

# 与 Kerberos 有关的参数设定!因为我们没有 Kerberos 主机,所以底下不用设定!
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosTgtPassing no
 
# 底下是有关在 X-Window 底下使用的相关设定!
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
# 登入后的项目:
PrintMotd no # 登入后是否显示出一些信息呢?例如上次登入的时间、地点等
             # 等,预设是 yes ,但是,如果为了安全,可以考虑改为 no
PrintLastLog yes     # 显示上次登入的信息!可以啊!预设也是 yes
KeepAlive yes       # 一般而言,如果设定这项目的话,那么 SSH Server 会传送
             # KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
             # 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会
             # 有僵尸程序的发生!
UsePrivilegeSeparation yes # 使用者的权限设定项目!就设定为 yes 吧!
MaxStartups 10      # 同时允许几个尚未登入的联机画面?当我们连上 SSH ,
             # 但是尚未输入密码时,这个时候就是我们所谓的联机画面啦!
             # 在这个联机画面中,为了保护主机,所以需要设定最大值,
             # 预设最多十个联机画面,而已经建立联机的不计算在这十个当中

# 关于使用者抵挡的设定项目:
DenyUsers *        # 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部
             # 挡吧!若是部分使用者,可以将该账号填入!例如下列!
DenyUsers test
DenyGroups test      # 与 DenyUsers 相同!仅抵挡几个群组而已!

# 关于 SFTP 服务的设定项目!
Subsystem sftp /usr/lib/ssh/sftp-server
如果不愿意开放 SFTP 的话,将这一行批注掉即可!

HowTo Use Fuse-sshfs to Mount Remote Filesystems

传统我们服务器之间文件共享的方式有采用NFS、Samba等等,但是在我看来配置都有一定的复杂性,当然复杂也有它们的优势,这里推荐一个依赖于SSH的文件共享工具,Fuse-sshfs。

SSH 是一个强大且安全的工具,我们除了可以用它来远程管理主机外,还可以通过它建立 SSH tunnel 作 Proxy 用,远程传输文件等等。而这里我想要介绍另外一个功能,那就是结合 sshfs 这个工具可以把远程主机的文件系统映射到本地主机上,透过 SSH 把远程文件系统挂载到本机上,这样我们可以不必使用 scp 工具就可以做到直接复制及删除远程主机的文件了,就像操作本地磁盘一样方便。

sshfs 是基于 FUSE 构建的 SSH 文件系统客户端程序,通过它远程主机的配置无需作任何改变,就可以透过 SSH 协议来挂载远程文件系统了,非常方便及安全。

Install fuse-sshfs

1
2
[cent@localhost ~]$ sudo yum install -y epel-relese
[cent@localhost ~]$ sudo yum --enablerepo=epel install -y fuse-sshfs

挂载远程 ssh文件系统

1
2
3
4
5
[cent@localhost ~]$ mkdir ./mnt
[cent@localhost ~]$ sshfs root@192.168.16.230:/home/ ./mnt
root@192.168.16.230's password:
[cent@localhost ~]$ mount
root@192.168.16.230:/home/ on /home/cent/mnt type fuse.sshfs (rw,nosuid,nodev,user=cent)

卸载远程 ssh文件系统

1
[cent@localhost ~]$ fusermount -u ./mnt

常用参数

1
2
3
4
5
6
-C 压缩,或者-o compression=yes
-o reconnect 自动重连
-o transform_symlinks 表示转换绝对链接符号为相对链接符号
-o follow_symlinks 沿用服务器上的链接符号
-o cache=yes
-o allow_other 这个参数最重要,必须写,否则任何文件都是Permission Deny

缺点

当然sshfs也不尽是优点,例如远程主机失去响应后本地挂载点卡死并影响本地系统使用,需要手工找出 sshfs进程并杀死,因网速问题造成操作响应缓慢等等,不过一般在稳定快速的网络中不太会遇上,对比其强大的功能,还是可以接受的,正所谓暇不掩瑜。

  1. 所以sshfs适合内部网络比较稳定的地方
  2. 配合ssh免密登录使用会更好哦
  3. 可以看到的是sshfs默认挂载是rw的权限,但是通过sshfs –help 可以看到有非常详尽的参数配置可以选择,大家可以仔细研究下。

附1.

Link 在windows下可以使用sshfs.

使用mosh代替ssh连接服务器

身为一名服务器运维人员,每天打交道最多的就是服务器了,最常用的连接服务器的工具就是SSH,因为SSH是一个不可持续的连接,当网络出现波动时,SSH断开会导致当前正在运行的服务中断,对工作产生非常大的影响,无意间看到了Mosh这个东西,安装使用下,发现网络波动这种事情不会导致服务器连接断开了,特意查了下,原来Mosh使用的是UDP方式传输:虽然也支持使用SSH配置进行认证登录,但是数据传输本身是使用UDP方式的,Mosh支持在会话中断时,不会立即退出,而是启用一个计时器,当网络恢复后会自动连接,同时会延续之前的会话,不会重新开启一个。

Mosh 主页

1. 安装配置

需要在服务端和客户端同时安装Mosh:

1
2
3
# 以centos 6.x 为例:
[user@host ~]$ sudo yum install -y epel-release
[user@host ~]$ sudo yum install -y mosh

2. 采用SSH配置进行认证登录,只需要将ssh 替换为mosh即可

1
2
3
4
[user@host ~]$ mosh user@host

# 如何需要指定特定的ssh port或者使用ssh keyfile. 可以使用-ssh参数:
[user@host ~]$ mosh -ssh="ssh -i ~/.ssh/id_rsa -p 10002" user@host

3. Other

另外Mosh还支持使用临时key的方式认证,需要服务器端创建临时key,然后客户端通过这个key进行登录,该key在会话结束的十分钟后自动失效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建临时key
[user@host ~]$ mosh-server
MOSH CONNECT 53371 asdAADfdse234LSDSdIbow
mosh-server (mosh 1.2.4)
Copyright 2012 Keith Winstein <mosh-devel@mit.edu>
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[mosh-server detached, pid = 27290]

# 然后在client定义MOSH_KEY
[user@host ~]$ export MOSH_KEY=asdAADfdse234LSDSdIbow
# 注意mosh-client只能跟上具体的ip和临时端口,不支持主机名和域名方式

# 使用临时key连接服务器
[user@host ~]$ mosh-client 10.0.2.4 53371

在CentOS中配置 SFTP 环境

       做运维工作的,应该经常会碰到这样的问题,需要新上一个web项目,需要上传文件到服务器上,解决方法有很多种,常见的如sftp和ftp,今天讲如何使用sftp让系统用户用户上传项目的权限,并且实现chroot和无法使用ssh登录到系统。

       SFTP是指SSH文件传输协议(SSH File Transfer protocol)或安全文件传输协议(Secure File Transfer Protocol),它提供了可信数据流下的文件访问、文件传输以及文件管理功能。当我们为SFTP配置chroot环境后,只有被许可的用户可以访问,并被限制到他们的家目录中,换言之:被许可的用户将处于牢笼环境中,在此环境中它们甚至不能切换它们的目录。

1. 测试环境

  • MacBook Pro 15-inch i7 16GB
  • VMware Fushion 8 Pro
  • Transmit ( SFTP tools for Mac )
1
2
3
4
5
[root@test ~]# cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m
[root@test ~]# rpm -qa | grep openssh-server
openssh-server-5.3p1-104.el6.i686

2. 实验步骤

2.1 增加一个sftpusers用户组
1
[root@test ~]# groupadd sftpusers
2.2 创建一个用户user01,并分配给sftpusers用户组
1
[root@test ~]# useradd -g sftpusers user01
2.3 修改用户家目录及指定不能登录shell
1
2
[root@test ~]# mkdir /sftp/
[root@test ~]# usermod -s /sbin/nologin -d /sftp/user01 -m user01
2.4 给用户创建密码(注意密码不明文显示)
1
2
3
4
5
6
7
8
[root@test ~]# passwd user01
Changing password for user user01.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[root@test ~]#

2.5 修改ssh的配置文件,如下设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@test ~]# ll /etc/ssh/sshd_config
-rw-------. 1 root root 3879 Oct 15 2014 /etc/ssh/sshd_config
[root@test ~]# vim /etc/ssh/sshd_config

# line 132
#Subsystem sftp /usr/libexec/openssh/sftp-server #注释
Subsystem sftp internal-sftp #修改为internal-sftp

# add this lines at the end of file
Match Group sftpusers #指定一下参数仅适用的用户组sftpusers
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h #设置chroot将用户锁在家目录,%h=家目录
ForceCommand internal-sftp #该参数强制执行内部sftp
2.6 重启ssh服务
1
2
3
[root@test ~]# /etc/init.d/sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
2.7 设置用户家目录权限,(注意权限不能大于0755)
1
2
3
[root@test ~]# chmod 0755 /sftp/user01/
[root@test ~]# chown root /sftp/user01/
[root@test ~]# chgrp -R sftpusers /sftp/user01/
2.8 关于上传,根目录无法上传文件。

       因为用户家目录属主是root,并且权限最大0755,所以没法写,我的解决方法是在在家目录建立一个文件夹,作为上传目录,并把属主给user01即可。

1
2
[root@test ~]# mkdir /sftp/user01/upload
[root@test ~]# chown user01:sftpusers /sftp/user01/upload/

3. 测试验证

3.1 Linux 登录测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@test ~]# su - user01
This account is currently not available. #su - 切换失败

[root@test ~]# cat /etc/passwd | tail -1
user01:x:500:500::/sftp/user01:/sbin/nologin

[root@test ~]# ssh user01@localhost
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is f3:fc:31:dc:7d:16:d5:ad:8c:bc:eb:69:8f:b2:0b:c9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
user01@localhost's password:
This service allows sftp connections only. #ssh登录也失败,ssh设置成功
Connection to localhost closed.

[root@test ~]# sftp user01@localhost
Connecting to localhost...
user01@localhost's password:
sftp> ls
upload
sftp> pwd
Remote working directory: /
sftp>
3.2 SFTP 工具测试

       我这里使用的是Mac,但是传统的文件传输工具都差不多,Windows下有Winscp、Xftp等。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×