打造安全的 Linux 环境:实用配置指南
唠唠闲话
一开始接触服务器,我只是把它当博客的托管网站,源文件用 GitHub 备份,所以网站被黑了也没啥关系。但随着使用深入,网站逐渐加入我的日常工作流中,而且有了使用更多服务的需求。在这种情况下,服务器安全是一个非常需要重视的问题了。
当然,还有一个动机。实验室服务器由我和几位同学负责日常管理,前段时间还出现过被挖矿的行为。与云服务器不同的是,实验室服务器缺少企业提供的保护,容易成为被攻击对象。所以,在安全意识层面,有必要进行一次“升级”。
本篇主要参考 Bensz 的 Linux 基础 个人 VPS 安全,非常适合新手入门。
网络安全是一个相对的概念,你要做到的不是绝对安全,而是比大多数人安全。 这样攻击者就不会去啃你这个硬骨头,而去找一些软柿子(那些没有安全防护的VPS)捏了。
安全措施
接下来是具体实践的部分,出于安全考虑,在修改核心配置时,建议 先备份原始文件。修改配置和重启服务后,先在新的终端尝试连接服务器,确认无误后,再退出当前的连接。如果错误修改了配置,当前连接状态通常不会掉,发现新终端连不上还能及时改回来。
mkdir backup
sudo cp /etc/ssh/sshd_config ./backup
此外,这些策略更多是防止网络攻击,而不影响机房对服务器的连接。比如禁用 Root 密码登录后,仍可以正常使用云服务器的“远程登录”。同理,机房登录服务器也不受这些策略影响。
禁用 root 密码登录
一般情况下,主机是允许 root 用户远程登陆的。而 root 用户的名字一般就是 root。所以,如果攻击者知道你 VPS 的 ip 地址(ping 你的域名获得)、用户名(默认有一个 root 可用)和 ssh 端口号(默认 22 ),那么保护你电脑的就只有你的用户密码了。
root 用户拥有服务器的最高权限,一旦被攻陷,服务器就完全任人宰割了。所以第一步,在首次配置好 ssh 密钥后,我们将 root 的登录功能禁掉。
如下,用编辑 ssh
配置文件
sudo vim /etc/ssh/sshd_config
输入 /Permi
回车检索,找到 PermitRootLogin
,将其注释掉
#LoginGraceTime 2m
PermitRootLogin yes
# PermitRootLogin prohibit-password
然后重启 sshd 服务
sudo systemctl restart sshd
顺带一提,重启 ssh 服务有八条命令可用,暂时不清楚区别
sudo systemctl restart/reload sshd/ssh
sudo service ssh/sshd restart/reload
禁用普通用户密码登录
除了禁用 root 用户,也可以设置所有用户不能密码登录,这一来攻击者就不可能用暴力穷举的方式登录任何账号了。
同前边操作,先
vim /etc/ssh/sshd_config
检索并修改参数为 PasswordAuthentication no
,然后重启 ssh 服务。
当然,禁用所有用户密码登录的措施可能太严厉了,也可以检索 Match User
,对某一用户单独修改。
这段代码通常在文件最后:
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
修改如下,并重启服务。
# Example of overriding settings on a per-user basis
Match User usernamePasswordAuthentication no
创建用户名时,应避免使用常见名词,比如 test
之类。攻击者通常会对 IP 进行批量无差别攻击,由于对个体信息缺少了解,它们只能用常见词表来尝试用户名。比如上次实验室被挖矿就是前管理员创了个名为 tmp
的用户,且设置了弱口令密码。
更改默认 ssh 端口
默认的 ssh 端口号是 22。SSH 的端口一般建议把它改成一个大于 1024 小于 65535 的整数。举个例子,比如改为 1234。
同前边操作,用 vim 检索 /etc/ssh/sshd_config
的 Port
参数,更改如下
Port 1234
#AddressFamily any
#ListenAddress 0.0.0.0
修改后重启 ssh 服务生效。
注意,如果开启了防火墙,需开放新端口后再修改 ssh 端口,具体见下文。
密码复杂度策略
除了禁用登录,也可以采用相对温和的策略来防止穷举:通过修改 PAM(Pluggable Authentication Modules)来设置用户密码的强度、长度和重试间隔。
设置密码强度
这部分参考了 How to enable and enforce secure password policies on Ubuntu。
安全起见,先备份原始文件
mkdir -p backup
sudo cp /etc/pam.d/common-password ./backup/
安装相关依赖
sudo apt install libpam-pwquality -y
这是原始文件 /etc/pam.d/common-password
的部分内容
# here's the fallback if no module succeeds
password requisite pam_deny.so
将 requisite
所在行修改为
password requisite pam_pwquality.so retry=3 minlen=8 difok=3
requisite
常用参数的解释:
retry=N
:限制用户在输入错误密码后可以再次尝试的次数。minlen=N
:指定密码的最小长度。difok=N
:指定密码中必须包含的不同字符数。ucredit=-N
:指定密码中必须包含的大写字母数。lcredit=-N
:指定密码中必须包含的小写字母数。dcredit=-N
:指定密码中必须包含的数字数。ocredit=-N
:指定密码中必须包含的特殊字符数。
注意这些参数中的 -N
表示至少需要包含 N
个字符,而省略符号 -
则表示必须刚好包含 N
个字符。
对于新用户,上述设置将立即生效。对于现有用户,他们的密码策略将在下一次更改密码时应用
设置重试间隔
我们要用到一个 pam_fallock
的模块。
auth required pam_faillock.so preauth silent audit deny=3 unlock_time=1200
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600
这部分设置后没效果,不确定是否和模块版本有关,但这个感觉挺重要,后续再排查下问题。
开启防火墙
前边主要是针对 ssh
登录的保护策略,除此之外,可以用防火墙工具 ufw
(Uncomplicated Firewall) 保护其他端口。
个人服务器建议开启防火墙,这样能可以加一层保护,对当前开放的端口有更好的把控。实验室服务器使用场景复杂,方便起见,考虑可以不启用。
先查看是否安装了防火墙
which ufw # /usr/sbin/ufw
如果没有,直接安装一个
sudo apt-get install ufw
防火墙常用命令
sudo ufw status # 查看当前状态 | inactive 代表关闭
sudo ufw enable # 开启防火墙
sudo ufw disable # 关闭防火墙
sudo ufw allow 22 # 允许访问 22 端口
sudo ufw allow from 127.0.0.1 to any port 22 # 允许 127.0.0.1 访问 22 端口
sudo ufw status numbered # 显示序号,作为 delete 操作的索引
sudo ufw delete <数字> # 删除第几个规则
# 删除规则更建议的方式,用 delete + 规则
sudo ufw delete allow 22 # 删除规则 allow 22
sudo ufw delete allow 22/tcp # 删除规则 allow 22/tcp
sudo ufw default deny incoming # 禁止所有进站的流量
sudo ufw default allow outgoing # 允许所有出站的流量
如果前边更改了 ssh
端口为 1234
,则这里执行
sudo ufw allow 1234/tcp comment "this is for ssh"
sudo ufw delete 22
禁用 Ping
除了加强服务器自身的安全防护,还可以用禁 ping 的方式避免服务器被穷举搜索到。
StackExchange 上给了很多种方案:How to Disable Ping Response (ICMP echo) in Linux all the time?
这里采用 Iptables 方法来弄,执行
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
在服务器上 ping 自己,ping 域名或 IP,会发现已经 ping 不通了。
iptables 还有其他规则和用法,后边有空再补充更新。
Fail2ban 防扫描和暴力破解
和前边设置登录重试间隔一样,这部分我的实践也没有成功,可能 PAM 版本问题?后续再尝试
Fail2ban 是防止后台暴力扫描的流行保护软件之一,安装方法
sudo apt update && sudo apt install fail2ban -y
查看防护状态
sudo fail2ban-client status
返回内容如下
Status
|- Number of jail: 1
`- Jail list: sshd
编辑 /etc/fail2ban/jail.conf
文件,检索 /sshd modes
来配置 ssh
的监控策略
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 600
我在云服务器执行这一步设置后,似乎未生效,尽管能看到用户尝试多少次,但并不会终止用户的尝试,很奇怪。。。
小结
本篇针对服务器安全采用了几种策略:禁用密码登录(root/所有用户/特定用户);开启防火墙;更改 ssh 端口;增强密码复杂度;禁 ping 以及使用 Fail2Ban 工具。
这些可以让 VPS 更安全,但不是绝对的,后续接触到其他重要的安全策略,再来进行补充。
相关文章:
打造安全的 Linux 环境:实用配置指南
唠唠闲话 一开始接触服务器,我只是把它当博客的托管网站,源文件用 GitHub 备份,所以网站被黑了也没啥关系。但随着使用深入,网站逐渐加入我的日常工作流中,而且有了使用更多服务的需求。在这种情况下,服务…...
神经网络有哪些算法
神经网络算法是人工智能领域的重要组成部分,它通过模拟人类神经系统的结构和功能,实现对复杂问题的处理和分析。以下是对神经网络算法的详细概述,包括常见的算法和它们的特点、应用等,力求达到约2500字的篇幅。 一、神经网络算法概述 神经网络算法是一种基于人工神经元的…...
计算机网络期末试题
第一章 概述 一. 单选题(共13题,36.4分) 1. (单选题) 因特网起源于( )网络。 A. ARPANETB. EthernetC. CATVD. CERNET 我的答案: A:ARPANET;正确答案: A:ARPANET; 2.8分 2. (单选题)人们把( )年作为因特网的诞…...
Unity学习笔记---图层
渲染层级 1,调整Sprite Renderer中的Order in Layer可以调整图层层级。 2,在Edit--Project Setting--Graphics中,调整TransParency Sort Mode为Custom Axis, 并将TransParency Sort Axis中的Z值默认的1改为0,将Y改为…...

【简单探索微软Edge】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...

YOLOv5独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024
💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv5结合:替代YOLOv5的backbone 收录 YOL…...
概率密度函数pdf的某种解释与洞察
1.一个想法实验 我在想一个数,姑且称之为X,介于0和10之间(含0和10)。如果我不告诉你别的,你会想象X = 0的概率是多少?X = 4?假设我对任何特定的数字都没有偏好,你会想象十一个整数0,1,2,.….,10也是一样。因为所有的概率加起来必须是1,所以逻辑上的结论是给11个选项…...
【OceanBase诊断调优】—— 转储错误(错误代码 4138/ORA-01555)
当读事务很长时,租户进行转储会报 4138/ORA-01555 错误。本文介绍该错误的处理方法。 适用版本 OceanBase 数据库 V2.X 及以后的版本 问题现象 当读事务很长,租户进行转储时会出现以下错误。 Oracle 租户: ORA-01555:snapsho…...
Python面试题【数据结构和算法部分101-130】
Python面试题【数据结构和算法部分101-130】 Python面试题【数据结构和算法部分101-130】 Python面试题【数据结构和算法部分101-130】 问题:如何在Python中实现二分查找? 答案: def binary_search(arr, target):low, high 0, len(arr) - 1…...
Django中的日志处理
日志处理 1.日志级别 级别(Level)表示日志消息的优先级,从低到高分为以下几个级别: DEBUG: 详细的日志信息,通常用于调试。 INFO: 一般的信息性消息,用于说明程序运行情况。 WARNING: 警告消息࿰…...

FonePaw Data Recovery for Mac:轻松恢复丢失数据
FonePaw Data Recovery for Mac是一款功能强大的数据恢复软件,专为Mac用户设计,帮助用户轻松恢复因各种原因丢失的数据。该软件支持从硬盘驱动器、存储卡、闪存驱动器等存储介质中恢复丢失或删除的文件,包括照片、视频、文档、电子邮件、音频…...

C语言易错提醒选择题精选
Ⅰ 易错题 1.设有double p;,为变量p声明一个引用名称rp,则定义语句为 double& rpp; 2.已知‘A’一‘Z’的ASCII码为65—90,当执行“char ch14*52;cout<<ch<<endl;”语句序列后得到的输出结H ,72对应ASCII码中…...
Android11系统去掉截屏功能
1. 去掉Settings里截屏菜单条目,packages/apps/Settings: diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml old mode 100644 new mode 100755 index a5e4d06..a9420bb --- a/res/xml/top_level_settings.xmlb/res/xml/t…...
测试驱动来学习 Promise
基础功能 测试案例:以同步的方式调用。 /*** v1: 基础功能*/ const p1 new MyPromise((resolve, reject) > {resolve(success)reject(error) })p1.then((value) > {console.log(v1: , value) }) 实现功能:在 status 和 value 的位置暂存值&…...

Vue3实战笔记(20)—封装头部导航组件
文章目录 前言一、封装头部导航栏二、使用步骤总结 前言 Vue 3 封装头部导航栏有助于提高代码复用性、统一风格、降低维护成本、提高可配置性和模块化程度,同时还可以实现动态渲染等功能,有利于项目开发和维护。 一、封装头部导航栏 封装头部导航栏&am…...

Yolov8目标检测——在Android上部署Yolov8 tflite模型
1. 简介 YOLOv8 是一种用于目标检测的深度学习模型,它是 YOLO(You Only Look Once)系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎,特别是在需要实时目标检测的应用中,如视频监控、自动…...
(delphi11最新学习资料) Object Pascal 学习笔记---第12章操作类(类方法和类数据)
第12章 操作类 在过去的几章中,你已经了解了 Object Pascal 语言面向对象的基础:类、对象、方法、构造函数、继承、后期绑定、接口等等。现在,我们需要进一步了解与类管理相关的一些更高级、更具体的语言特性。从类引用到类助手(class he…...

面向 C# 开发人员的电子邮件转换控件 - EML 到 PNG
本文将使 C# 开发人员能够以编程方式将EML或MSG转换为其他流行的文件格式。Aspose.Email 提供了类和方法以及在线 电子邮件转换器工具,可将 EML无缝转换为PNG 。如果不安装第三方软件,则无法打开 EML/MSG 文件。因此,将 EML/MSG 转换为 PNG 和…...
Vue3:数据交互axios
回调函数 > 回调函数: 一些特殊的函数,表示未来才会执行的一些功能,后续代码不会等待该函数执行完毕就开始执行了 1. Promise 1.1 简介 > 前端中的异步编程技术,类似Java中的多线程线程结果回调! * Promise 是异步编程的一种解决方案,…...
芯片的性能指什么
【省带宽、压成本专题】降低30%视频码率,深挖“窄带高清”的实现原理 - 知乎 芯片(或微处理器、集成电路)的性能主要指其完成特定任务的能力和效率。性能可以通过多种参数来衡量,这些参数反映了芯片设计的不同方面,包…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...