打造安全的 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%视频码率,深挖“窄带高清”的实现原理 - 知乎 芯片(或微处理器、集成电路)的性能主要指其完成特定任务的能力和效率。性能可以通过多种参数来衡量,这些参数反映了芯片设计的不同方面,包…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
Centos 7 服务器部署多网站
一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...
