Cal*_*laf 4 security ssh logs aws
我看到我自己的 ssh 登录到 AWS EC2 Ubuntu Linux 实例为
Nov 18 07:32:21 ip-10-20-30-40 sshd[9487]: Accepted publickey for ubuntu from 15.26.37.48 port 46273 ssh2: RSA SHA256:e37A/qiEdkHHNpeksdPO
Run Code Online (Sandbox Code Playgroud)
当我运行一些命令来寻找漏洞时
ubuntu@ip-12-34-56-78:~$ grep "Failed password" /var/log/auth.log
ubuntu@ip-12-34-56-78:~$ egrep "Failed|Failure" /var/log/auth.log
ubuntu@ip-12-34-56-78:~$ grep "Failed password" /var/log/auth.log | awk '{print $11}' | uniq -c | sort -nr
ubuntu@ip-12-34-56-78:~$ journalctl _SYSTEMD_UNIT=ssh.service | egrep "Failed|Failure"
ubuntu@ip-12-34-56-78:~$ journalctl _SYSTEMD_UNIT=sshd.service | grep "failure"
Run Code Online (Sandbox Code Playgroud)
什么都没有出现。到现在为止还挺好。
但是当我浏览日志文件时,我看到了两个可疑的问题。首先,我看到“身份验证失败”:
ubuntu@ip-12-34-56-78:~$ grep "authentication failure" /var/log/auth.log
Nov 14 09:23:19 ip-12-34-56-78 sshd[9711]: Disconnecting authenticating user root 98.76.54.32 port 36745: Too many authentication failures [preauth]
Nov 14 09:23:22 ip-12-34-56-78 sshd[9713]: Disconnecting authenticating user root 98.76.54.32 port 36754: Too many authentication failures [preauth]
Nov 16 11:45:29 ip-12-34-56-78 sshd[20710]: Disconnecting invalid user admin 15.48.27.78 port 51289: Too many authentication failures [preauth]
Run Code Online (Sandbox Code Playgroud)
其次,即使我通过 SSH 连接,也会ssh -i myKeyPair.pem ubuntu@55.89.144.233出现如下所示的行。
Nov 17 17:17:01 ip-12-34-56-78 CRON[948]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov 17 17:17:01 ip-12-34-56-78 CRON[948]: pam_unix(cron:session): session closed for user root
Nov 17 18:23:25 ip-12-34-56-78 sshd[1004]: Invalid user stuart from 34.55.89.144 port 32946
Nov 17 18:23:25 ip-12-34-56-78 sshd[1004]: Connection closed by invalid user stuart 34.55.89.144 port 32946 [preauth]
Nov 17 07:29:47 ip-12-34-56-78 sshd[32620]: Invalid user ubnt from 21.34.55.89 port 56171
Nov 17 07:29:47 ip-12-34-56-78 sshd[32620]: error: Received disconnect from 21.34.55.89 port 56171:14: Unable to connect using the available authentication methods [preauth]
Nov 17 07:29:47 ip-12-34-56-78 sshd[32620]: Disconnected from invalid user ubnt 21.34.55.89 port 56171 [preauth]
Nov 17 12:39:00 ip-12-34-56-78 sshd[32695]: Did not receive identification string from 233.55.89.13 port 54959
Nov 17 23:51:58 ip-12-34-56-78 sshd[1396]: Received disconnect from 144.233.55.89 port 42056:11: Normal Shutdown, Thank you for playing [preauth]
Nov 17 23:51:58 ip-12-34-56-78 sshd[1396]: Disconnected from invalid user sinusbot 144.233.55.89 port 42056 [preauth]
Nov 17 23:52:24 ip-12-34-56-78 sshd[1398]: Invalid user sinusbot from 144.233.55.89 port 57180
Run Code Online (Sandbox Code Playgroud)
我不确定一堆问题:
ssh -i myKeyPair.pem ubuntu@11.22.33.44. 两者在安全性上是相同的,因为任何获取 pem 文件或私钥的人都可以不受阻碍地进入。我做对了吗?对于不那么混乱的分析,我发现last -i并且lastb -i是必不可少的。
该preauth符号表示登录尝试失败。
该谢谢你打记号有点管理员幽默。
所有失败的尝试都会被记录下来。
正如您所说,“大门”对互联网开放......因此,除非您配置端口敲门,否则世界上的每个主机都已经“到达大门”。
一般来说,如果公钥是ssh您的配置的唯一身份验证方法,则脚本机器人是相当无懈可击的。但是,您每月可以进行数千次尝试,甚至更多。
如果您担心此类尝试,您可以安装和配置fail2ban。
对于开始查看日志文件的大多数经验不足的管理员来说,可能会有片刻的恐慌。我知道当我有我的时候,我开始问你发布的许多相同的问题。这是对在您的互联网小角落看似无休止的黑客攻击尝试的常见反应。
我的技术朋友和同事向我保证,我所看到的不是有针对性的攻击,主要是自动脚本检查低垂的果实。它是....
有用户名和密码列表,可以在各种不太知名的地方购买和出售。运行脚本机器人的个人购买这些列表中的一个或多个,并使用它来尝试访问特定子网内的任何机器,甚至可能爬行整个 IPv4 地址空间。
这就是为什么您会看到一整个系列的一百个左右的名字,例如:Fred、Sally、George ……等等……您甚至可能会看到您的名字或类似的名字。您可能正在运行的其他服务(例如电子邮件)也是如此。如果您查看该/var/log/mail.log文件,您将看到相同类型的用户名和密码组合黑客尝试。
这些攻击都是机器人。如果您在服务器上配置了合理的安全措施,您就不太可能因ssh黑客攻击而受到损害。
SSH 密钥对有一个公共组件和一个私有组件。绝不能分发私有组件。公共组件应该放在目标服务器的~/.ssh/authorized_keys文件中。
在公钥身份验证期间,该密钥的私钥和密码都不会通过连接传输。一旦发生身份验证,ssh会话将使用商定的对称会话密钥进行加密。窃取了您的私钥的攻击者仍然需要找出您的密码。并且该攻击者不应该能够在不损害存储您的私钥的机器的情况下嗅探该密码短语。
SSH 密钥是加密对象,因此在任何给定算法的整个生命周期中都会受到算法失效日期和/或漏洞的影响。因此,确保您的服务器软件经常更新并且针对任何新发现的问题检查您的用户密钥非常重要。
在撰写本文时,标准算法似乎仍然是 RSA 2048。AWS 密钥脚本根据AWS 文档生成 RSA 2048 密钥。但是,我已将所有密钥更改为 Curve 25519,因为这些密钥要短得多,而且该算法据称是独立于任何国家机构或可能受到损害的实体开发的。
由于您已经指出您在开始时启用了 ssh 公钥身份验证并禁用了密码身份验证,因此没有理由怀疑远程攻击者已禁用公钥身份验证。就是这样,除非您的 AWS 账户本身已被盗用。但是,您可能会收到一些关于用于访问您的 AWS 账户的意外 IP 地址的通知。
如果您想要更长的日志记录,您可以延长logrotate和/或安装auditd保留日志文件的时间长度。
适用于小型/个人服务器的健全的 ssh 安全措施
sudo需要 root 权限的用户启用对于大多数新安装,唯一应该更改的设置是启用公钥身份验证和禁用 X11。
/etc/ssh/shhd_config
...
PermitRootLogin no
...
PubkeyAuthentication yes
PasswordAuthentication no
X11Forwarding no
...
Run Code Online (Sandbox Code Playgroud)
疯狂的 ssh 安全
除上述之外,启用端口敲门,将主机密钥限制为单一算法(例如 Curve 25519),将服务器的主机密钥指纹放入域的 DNS 记录中,并使用 DNSSEC 保护该记录。
sshd服务器。请注意,一旦完成并且您尝试再次连接,主机密钥将不匹配。在连接尝试替换本地存储的主机密钥指纹时按照说明进行操作。/etc/ssh/sshd_config
...
#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
...
Run Code Online (Sandbox Code Playgroud)
sshfp选定的主机密钥生成DNS 记录:ssh-keygen -r domain.tld -f /etc/ssh/ssh_host_ed25519_key
生成的记录可以放在您域的 DNS 区域文件中,ssh连接将检查该指纹。这可以防止在首次连接时或服务器的主机密钥更改时对 ssh 进行中间人攻击。
并按照文档进行配置:
knockd is a port-knock server. It listens to all traffic on an ethernet (or PPP) interface, looking for special "knock" sequences of port-
hits. A client makes these port-hits by sending a TCP (or UDP) packet to a port on the server. This port need not be open -- since knockd
listens at the link-layer level, it sees all traffic even if it's destined for a closed port. When the server detects a specific sequence
of port-hits, it runs a command defined in its configuration file. This can be used to open up holes in a firewall for quick access.
....
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -A INPUT -s %IP% --dport 22 -j ACCEPT
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)