- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2022-11-06 ❤️
- ❤️ 本篇更新记录 2022-11-06 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥
1. 前言
在前面学习 【树莓派不吃灰】使用frp内网穿透,实现远程访问树莓派 的时候,我们涉及到一个SSH安全访问问题。
把内网的服务暴露给外网,意味着如果不加限制,那么在外网的任意一个角落都能访问到我们的内网服务,这就会涉及到安全问题。
- 一些不法分子通过SSH登录你的内网服务器植入病毒,暴力破解,消费你的服务器资源
- …
所以这篇我们讲一些SSH常规安全策略。
2. SSH安全策略
对于外网的访问,我们按照TCPIP协议分层从下往上来分析:
- 信任特定IP地址访问
- 给SSH加上特定复杂账号密码
建议安全策略流程:
-
优先使用sshKey的方式
—— 对应 2.3方式 其次如果发现还是有人尝试破解,再限制IP以及防火墙
2.1 设置 /etc/hosts.allow 和 /etc/hosts.deny
在Linux系统/etc目录下,有两个配置文件:hosts.allow & hosts.deny。
- hosts.allow(白名单)
允许
某些ip地址/地址段访问某些资源或服务 - hosts.deny(黑名单)
禁止
某些ip地址/地址段访问某些资源或服务
这两个文件配置选项一样,主要是功能刚好相反。
记住:
当两个文件有同样的配置(比如针对同一个IP)时,hosts.allow的优先级更高,也就是说以hosts.allow配置为准
。allow设定可越过deny限制。
2.1.1 配置格式
两个文件配置格式一样,如下:
服务:地址:允许/禁止
其中,各个参数如下:
- 服务
服务可以是sshd
、vsftpd
、smbd
、telnetd
、httpd
,也可以是all
(所有服务)。看名字就知道对应哪些服务。 - 地址
地址可以是某个具体的ip地址
,也可以是地址段
,比如192.168.1.1,192.168.1.0/24,192.168.1.,192.168.3.* 等等 - 允许/禁止
第三项是allow
或者deny
,其中,:deny
和:allow
可以省略不写。
2.1.2 配置案例
- 允许192.168.1.1主机sshd远程登陆
编辑
hosts.allow
文件,
- 写入
sshd:192.168.1.1:allow
- 或者
sshd:192.168.1.1
- 允许192.168.1.0/24网段的所有主机远程访问所有资源
编辑
hosts.allow
文件,
- 写入
all:192.168.1.0/24:allow
- 或者
all:192.168.1
.
- 禁止192.168.1.0/24主机telnet远程登陆
编辑
hosts.deny
文件,
- 写入
telnetd:192.168.1.*:deny
- 或者
telnetd:192.168.1.0/24
- 限制所有的ssh,除非从192.168.1.0——127上来
编辑
hosts.allow
文件,
- 写入
sshd:192.168.1.0/255.255.255.128:allow
编辑
hosts.deny
文件,
- 写入
sshd:all:deny
- 限制所有人的TCP连接,除非从192.168.1.0——127上来
编辑
hosts.allow
文件,
- 写入
all:192.168.1.0/255.255.255.128:allow
编辑
hosts.deny
文件,
- 写入
all:all:deny
- 限制192.168.1.0——127对所有服务的访问
编辑
hosts.deny
文件,
- 写入
all:192.168.1.0/255.255.255.128:deny
知识点:
IP地址范围的写法有若干种,主要的三种是:
- 网络地址——子网掩码方式:192.168.1.0/255.255.255.0
- 网络地址方式:218.64.(即以218.64打头的IP地址)
- 缩略子网掩码方式,既数一数二进制子网掩码前面有多少个“1”比如:218.64.87.0/255.255.255.0《====》218.64.87.0/24
2.1.3 注意要点
-
一般情况下,hosts.allow和hosts.deny
结合
起来一起使用,才能保证更好的安全性。即在hosts.deny文件中写入“all:all:deny
”,禁止一切ip地址远程访问所有资源,然后在hosts.allow文件中添加特定的ip地址允许远程访问资源即可。 -
设置拒绝所有之前,务必先配置好allow中的规则
。 -
ip地址可以是
私网地址
,也可以是主机所在的公网地址
。 -
当hosts.allow和hosts.deny有ip地址冲突时,以hosts.allow的设置为准。
2.1.4 配置SSH某一个IP地址访问树莓派
假如我们经常在公司家里两边跑,并且公司有一个固定IP地址段。那么我们就可以设置。
- /etc/hosts.deny 是黑名单列表,先在其中加上下面一行,阻止所有的 ssh 登录
sshd:all
- /etc/hosts.allow 是白名单,在其中加上允许访问的 IP 列表
sshd:111.222.333.444
结果就是只允许 IP 111.222.333.444 的主机登录(如果IP地址经常变,这个是有点麻烦!建议可以设置固定IP
)。但是记住,这里ssh是应用层协议
,外面访问的流量还是会流入树莓派。
流量 -> 物理网卡 -> 网络层 -> 传输层 -> 应用层
所以如何只是配置了sshd,只是说明被ssh应用层拦截而已。要想狠一点,sshd可以换成all。
那有没有办法在更底层拦截呢?
2.2 ufw 防火墙设置黑白名单
从
网络层
和传输层
阻止了进来的流量
UFW,或称 Uncomplicated Firewall
,是 iptables
的一个接口,为不熟悉防火墙概念的初学者提供了易于使用的界面,同时支持 IPv4 和 IPv6,广受欢迎。
UFW本质上就是配置黑名单
、白名单规则
。
2.2.1 安装ufw
输入命令:
sudo apt-get install ufw -y
2.2.2 常用命令(先了解莫动手)
直接输入 ufw --help 查看命令:
ufw --help
包括了配置命令以及app命令。
2.2.2.1 列出所有应用程序配置策略
sudo ufw app list
2.2.2.2 查找有关配置文件和包含规则的更多信息
sudo ufw app info 应用名字
2.2.2.3 允许SSH连接
备注:在服务器上正式启用 UFW 防火墙之前,需要事先添加允许 SSH 连接的传入规则;否则,即使UFW开启SSH连接命令,也无效
。
- sudo ufw allow ssh
- sudo ufw allow http
2.2.2.4 允许指定端口连接
以下命令主要是针对tcp连接:
- sudo ufw allow 3306/tcp
- sudo ufw allow 80/tcp
- sudo ufw allow 8080/tcp
- sudo ufw allow 22/tcp
2.2.2.5 允许指定端口范围内连接
除允许单个端口连接之外,UFW 还允许直接配置端口范围。在使用 UFW 的端口范围时,必需指定 tcp 或 udp 协议。
- sudo ufw allow 7100:7200/tcp
- sudo ufw allow 7100:7200/udp
2.2.2.6 允许指定特定IP地址入站
- sudo ufw allow from XX.YY.ZZ.MM
XX.YY.ZZ.MM 表示对应的ip地址。
2.2.2.7 拒绝指定特定IP地址入站
- sudo ufw deny from XX.YY.ZZ.MM
XX.YY.ZZ.MM 表示对应的ip地址。
2.2.2.8 启用UFW配置
sudo ufw enable
2.2.2.9 查看所有策略
sudo ufw status numbered
上面就是我们刚刚配置的全部规则。
- 最左边一列是
编号
,如果要删掉某一条规则可以用到它 - 通过英文意思,
ALLOW IN
(允许流量进入)From
(从哪里来)To
(到哪里去,也就是我们本机树莓派)
2.2.2.10 删除UFW策略
方式1:指定删除编号为XX的防火墙策略
sudo ufw delete XX
方式2:直接删除配置的规则,只需在原始规则前加上 delete 即可
sudo ufw delete allow http
sudo ufw delete allow 7100:7200/tcp
sudo ufw delete allow 80/tcp
2.2.2.11 禁用UFW配置
sudo ufw disable
2.2.2.12 重置UFW配置
sudo ufw rest
重置 UFW配置项时,系统会禁用 UFW 并删除所有活动规则。
2.2.2.13 设置默认策略
出去的流量全部放行,进来的流量全部阻止。
sudo ufw default allow outgoing
sudo ufw default deny incoming
2.2.2.14 设置完规则后,重启或执行命令
sudo ufw reload
即可完成 UFW 配置。
2.3 配置只使用密钥登录SSH
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口
,或者禁用 root 账户登录
。其实,有一个更好的办法来保证安全,而且让你可以放心地用 root 账户从远程登录——那就是通过密钥方式登录
。所以我们这里就尝试制作公钥登录。
了解内容:如果是经常玩github、gitee、gitlab这些的同学,就一定知道ssh-key的重要性,当我们把我们本地生成的ssh公钥上传到服务器后台的时候,后面所有的提交内容都不需要输入账号密码了。
- Git设置SSH
还记得
- 【树莓派不吃灰】SSH 连接报错“WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”的解决
讲到一个ssh连接失败问题,它本质上也是依赖于本地SSH缓存去校验一些认证信息。
这里我们会用到一个好用的ssh工具——FinalShell
(FinalShell - 一个免费且好用的ssh工具) 。
Windows版下载地址:
- http://www.hostbuf.com/downloads/finalshell_install.exe
macOS版下载地址:
- http://www.hostbuf.com/downloads/finalshell_install.pkg
操作步骤:
- 建立两个ssh连接配置(pi & root用户)
- 测试连接效果
- 直接查看资源使用率
2.3.1 登录树莓派制作密钥
创建公钥我们要使用到 ssh-keygen
#命令格式
ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/filename
其中参数说明:
-m 参数指定密钥的格式,PEM(也就是RSA格式)是以前使用的旧格式,很多ssh客户端都用这个格式。
-t:指定要建立的密钥类型
-b:指定密钥长度
-f:指定用来保存密钥的文件名 (~/.ssh/filename,这里我定义为Rpi3B.pem)
配置过程(最好输入一个密码,比如123456):
密钥对成功创建,文件所在位置:/home/pi/.ssh/
。其中 :
Rpi3B.pem 私钥
Rpi3B.pem.pub 公钥
2.3.2 安装公钥到树莓派
完成公钥的安装后,为确保连接成功,文件权限
也要确保配置正确。
pi@raspberrypi:~ $ cd .ssh/
pi@raspberrypi:~/.ssh $ cat Rpi3B.pem.pub >> authorized_keys
pi@raspberrypi:~/.ssh $ ls -al
pi@raspberrypi:~/.ssh $ chmod 600 authorized_keys
pi@raspberrypi:~/.ssh $ chmod 700 ~/.ssh
2.3.3 下载私钥到本地电脑
这个文件非常重要,好好保存。
2.3.4 finalShell 配置密钥登陆
登录成功。
2.3.5 修改SSH配置,只允许密钥登录
sudo nano /etc/ssh/sshd_config
找到几个关键的配置点:
- 允许使用密钥登录
- 禁止密码登录
- 最终配置
注意:
我们可以结合ufw配置,密码登录只有内网生效即可。
如果设备暴露在公网上,当你完成全部设置,并以密钥方式登录成功后,同时禁用密码登录功能,就可以加强其安全性防止ssh暴力破解。
2.3.6 重启sshd服务
配置改完之后重启ssh服务:
sudo service sshd restart文章来源:https://www.toymoban.com/news/detail-784271.html
2.3.7 再次测试三种登录方式
- 密码登录
- 本地密钥登录
- 远程密钥登录
3. 总结
本篇围绕着如何在外网上面更安全访问我们的树莓派服务,并且接受了多种方式进行限制,但是博主还是比较建议方式3。文章来源地址https://www.toymoban.com/news/detail-784271.html
参考文献
- Linux之防火墙管理篇[Ubuntu:ufw]
- 树莓派ssh连接使用公钥免密登录
到了这里,关于【树莓派不吃灰】基础篇⑮ SSH远程访问安全,涉及/etc/hosts.allow白名单 和 /etc/hosts.deny黑名单、ufw防火墙、密钥登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!