Browsed by
Tag: ssh

SSH 配置证书登录

SSH 配置证书登录

SSHd 配置采取了一些安全措施,比如:修改端口、禁止 root 远程登录(这里)、启动 fail2ban 防止恶意登录(这里),等等。目前看这些措施基本满足了日常的维护管理需求。

通常还会采取证书登录方式,禁止密码鉴权登录。不过以往考虑到密码方式更方便,因此没有动力去修改。时间就这么过去了……

最近登录服务器检查日志, 惊讶地发现 fail2ban 每日的日志居然有十几M之多,全是各类奇葩以各种方式尝试登录 SSH。虽然 fail2ban 工作得很好,但是万一出现了 bug 呢? 万一哪个变态就是锲而不舍、经年累月地尝试登录呢?应该下狠手,让老铁们彻底绝望,因此决定禁止密码方式登录,要求采用证书登录。

配置不复杂,涉及客户端生成证书密钥,以及将公钥上传到服务器等。主要参考 Linode 的两篇配置文档(这里这里)。 以下是详细步骤:

生成证书

客户端也是 Linux 系统,因此相当简单:

ssh-keygen -b 4096

该命令在当前用户的 .ssh 目录下创建了两个文件: id_rsa 以及 id_rsa.pub 。

其中 “id_rsa.pub” 是当前用户的公钥文件,将其上传到服务器上,然后添加进 ~/.ssh/authorized_keys 文件中:

cat id_rsa.pub >> ~/.ssh/authorized_keys

添加完成后,服务器上的 id_rsa.pub 文件不用再保留,删除即可。要注意,authorized_keys 文件应该设置为别人不允许访问,确保足够的安全性。例如设置文件权限为600:

chmod 600 authorized_keys

当 SSH 客户端登录时, SSHd 默认读取该用户的 authorized_keys 信息进行证书鉴权。

修改 /etc/ssh/sshd_config 文件

PasswordAuthentication no

然后重启 sshd 即可:

sudo systemctl restart sshd

之后,客户端如果采用密码鉴权方式登录,或者粗暴破解,将被无情拒绝。

如果有多个客户端需要登录服务器,则需要各自生成证书,并将公钥上传到服务器,并添加到 authorized_keys 文件中即可。

SSHd使用强加密算法

SSHd使用强加密算法

默认情况下,SSH服务器会启用各种尽可能的加密算法,其中包含一些很弱的加密算法,这确保了客户端广泛的接入,但是的确会引入一些风险。企业环境中设备是可控的,因此可以去掉弱加密算法而只保留特定的强加密算法。

Linux环境中查询以下帮助,可以了解包含算法在内的各项配置信息:

man 5 sshd_config

修改/etc/ssh/sshd_config文件,指定Ciphers采用强加密算法即可,例如,将下列语句直接加入到该文件后面:

Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,aes256-cbc

当然,最后要重启ssh服务才能使配置生效。

清除Putty主机指纹

清除Putty主机指纹

最近修改了主机上的公钥,结果导致Putty无法登录到主机,仔细检查后发现Putty还在使用原有的主机指纹,因此删除原有的记录即可(Putty似乎可以改进一下,重新提示用户是否保存或者修改,不是更合理吗?)。

删除方法比较简单,直接打开注册表,找到以下目录:

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys

然后删除对应的主机记录即可。

Linux系统ssh代理的问题

Linux系统ssh代理的问题

因为需要访问公司远程网络,而考虑到国内特殊的网络环境,通常在windows系统下都是使用putty创建本地socks5代理,在firefox中设置该代理访问internet。

但是在linux下,默认采用以下命令时,居然只能使用socks4代理:

ssh -D 6666 myname@mycompany.com

如果需要使用socks5代理,则需要明确指定本地的IP地址,命令如下:

ssh -D 127.0.0.1:6666 myname@mycompany.com

其实用netstat检查前一个命令的结果,能看到正确绑定了任意地址的6666端口,而后一个命令只是明确绑定在本地循环地址上。两者应该都能成功进行socks5代理才对。

不知道这是ssh的bug,还是firefox的bug? 简单搜索了一下,似乎也没有人提到这点。

VPS升级Debian的几点小事项

VPS升级Debian的几点小事项

数据中心升级,要求所有节点最好是64位系统。而我们的节点不幸是32bit系统,因此不得不大动干戈地重新构造系统。

原来的系统是采用Ubuntu 10.04,年代比较久了。这次升级打算全部换成Debian7,真是no zuo no die。虽说两个系统相差不大,但是其中的一些细节还是会坑死人的。

1、bash问题

Debian7中root用户采用bash,如果新创建一个用户,默认居然采用sh,无法理解。因此需要修改/etc/passwd文件,将用户对应的shell修改为bash即可。

2、sudoer问题

这个不是大问题,无非就是修改/etc/sudoers文件,手工将用户加入sudo用户列表中即可。(升级完成后,最好将用户剔出sudoer列表,只保留root用户)。

3、postfix与dovecot

这些配置折腾了几乎一天。在Ubuntu环境中,很容易搞定,ubuntu非常体贴的提供了一个安装包dovecot-postfix,几乎不需要配置就可以转起来。而Debian7则需要手工进行配置。首先dovecot必须安装以下几个包:

apt-get install dovecot-common dovecot-core dovecot-pop3d

在配置之前,首先要弄明白一些关键概念:

  • Postfix是发送邮件服务器,提供SMTP服务;
  • Dovecot是接收邮件服务器,提供IMAP/POP服务。
  • Postfix自身不鉴权,通过SASL与其他应用(例如SASL服务、POP3服务等)交互来实现鉴权。

通常网上的文章都会采用SASL服务器或者连接MySQL数据库等来实现一个非常复杂的邮件服务系统。而我们的需求没有这么夸张,debian系统的用户就是email用户,不需要进行区分。因此我们采用dovecot来鉴权。

跑个题先,网上居然有文档配置postfix时不进行鉴权,简直是纯找死的节奏,这种情况下,任何人都可以利用他的服务器发送邮件,过不了多久,相信全世界的邮件服务器都会视其为垃圾邮件服务器,直接屏蔽掉。

因此配置的关键点在于以下几点:

  • 告诉postfix,通过dovecot鉴权。
  • dovecot创建与postfix之间的管道,接受postfix的鉴权请求。
  • dovecot采用系统用户的信息直接鉴权。

3.1 配置dovecot

这里臭骂一下Debian。把dovecot的配置拆成N多文件,乱七八糟,有必要么?网上的参考文档多半是基于RHEL或者CentOS,基本都是在一个文件中进行配置(Ubuntu 10.04也基本是一个文件),Debian这种方式貌似很合理,实际操作起来更让人纠结。

首先修改/etc/dovecot/conf.d/10-auth.conf文件,设定以下参数:

disable_plaintext_auth = no
auth_mechanisms = plain login

接着修改/etc/dovecot/conf.d/auth-system.conf.ext文件,在文件尾添加以下配置:

service auth {
    unix_listener /var/spool/postfix/private/auth-dovecot {
        mode = 0660
        user = postfix
        group = postfix
    }
}

简要说明:在这个文件中,可以看到以下信息,默认就是采用系统用户鉴权。其中的passwd就是指/etc/passwd文件。

userdb {
  driver = passwd
}

而我们添加的信息,其实就是为postfix创建一个管道,准备接受postfix的鉴权请求。管道名称就是auth-dovecot,创建在/var/spool/postfix/private目录下。这个信息在postfix配置中需要用到。

3.2 配置postfix

debian系统中的postfix基本配置与其他linux版本没有太大差别,无非就是修改一些hostname信息等。鉴权配置需要修改,修改/etc/postfix/main.cf文件,在文件尾添加以下信息:

home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-dovecot
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sender_restrictions = reject_unknown_sender_domain

其中关键部分就是蓝色字体标识的部分。”smtpd_sasl_path”项就是在dovecot中配置的管道路径(在这些配置项上,我几乎摔得满头是包)。

完成上述配置后,重启dovecot和postfix服务即可:

service dovecot restart
service postfix restart

4、SSH

处于安全因素的考虑,修改默认的SSH登录端口以及禁止root用户远程登录。修改/etc/ssh/sshd_config文件:

Port 1234
PermitRootLogin no
使用fail2ban防止恶意ssh登陆

使用fail2ban防止恶意ssh登陆

最近检查了一下系统的流量等情况,发现有人尝试以root身份登陆系统,简单粗暴地尝试各种密码,实在是很没品的事。对付这种无聊人无聊事最好的办法就是安装fail2ban,让他们醒悟吧。

fail2ban的原理简而言之就是:扫描log文件,发现有告警就记录。当告警超过一定的阀值,例如失败了6次,就调用iptables,将对应的IP地址屏蔽一段时间(缺省为600秒)。因此首先要确保iptables已经安装了,否则仅仅靠fail2ban是没有任何作用的。

在Ubuntu 10.04环境安装fail2ban是件轻松愉快的事,运行以下命令即可:

sudo apt-get install fail2ban

安装后,fail2ban默认会随系统启动而启动。

由于ssh默认最大尝试数为6,我们希望改成3, 因此需要修改/etc/fail2ban/jail.conf文件。找到ssh段落简单修改即可:

[ssh]
...
maxretry = 3

然后重启fail2ban使新配置生效:

sudo service fail2ban restart

可以检查/var/log/fail2ban.log文件了解各种过滤情况。