Linux强化论:15步打造一个安全的Linux服务器
Linux强化论:15步打造一个安全的Linux服务器
可能大多数人都觉得Linux是安全的吧?但我要告诉你,这种想法绝对是错误的!假设你的笔记本电脑在没有增强安全保护的情况下被盗了,小偷首先就会尝试用“root”(用户名)和“toor”(密码)来登录你的电脑,因为这是KaliLinux的默认用户名和密码,而大多数人仍然会继续使用它们。你是否也是这样?我希望你不是!
在这篇文章中,我将会与大家分享一些能够让你的Linux主机更加安全的方法,其中还会包括一些渗透测试技巧。需要注意的是,目前市面上有很多不同的Linux发行版,从命令行工具的角度来看,这些版本虽然各有不同,但原理和处理逻辑是一样的。接下来,让我们开始吧!
1-记录主机信息
每当你在对一台新的Linux主机进行安全增强工作时,你需要创建一个文档并在文档中记录下本文所列出的各种项目,而且在工作完成之后,你还要对这些项目进行核查。除此之外,在文档的开头处,你需要记录下这台Linux主机的相关信息:
设备名称
IP地址
Mac地址
进行安全增强工作的负责人(其实就是你)
日期
资产编号(如果你在为一家企业工作,那么你就需要记录下这台设备的资产编号)
2-BIOS保护
你需要为这台主机的BIOS设置一个密码,以确保终端用户无法修改或覆盖BIOS中的安全设置,这是非常重要的!BIOS的管理员密码设置完成之后,你需要禁止主机从外部媒体设备(USB/CD/DVD)启动。如果你忽略了这项设置,那么任何人都可以通过一个写入了启动镜像的U盘来访问这台主机中的数据。
在新版服务器的主板中内置有一个Web服务器,你可以利用它来远程访问主机中的数据。所以你要确保已经修改了服务器管理页面的默认密码,如果可以的话,请直接禁用这个功能。
3-硬盘加密(机密性)
大多数Linux发行版在进行安装之前,都允许你对磁盘进行加密。磁盘加密是非常重要的,因为当你的计算机被盗之后,就算小偷将你的硬盘插入他们自己的计算机中也仍然无法读取你的数据。
在下图中,选择列表中的第三个选项:Guided-use entire disk and set up encrypted LVM(LVM代表逻辑卷管理器)。
如果你的Linux发行版不支持加密的话,你可以选择使用类似TrueCrypt这样的加密软件。
4-磁盘保护(可用性)
数据备份是一个很好的习惯,当系统发生崩溃或系统更新出现故障时,备份的优点就突显出来了。对于某些重要的服务器来说,为了防止灾难(包括自然灾害和人为因素)带来的影响,备份数据通常需要进行离线存储。当然了,备份也需要我们花精力去管理。比如说,旧的备份文件需要保存多久?何时需要对系统进行备份?(每天?每周?还是每月?)
核心系统的磁盘需要进行多个分区:
/
/boot
/usr
/home
/tmp
/var
/opt
磁盘分区可以在系统发生故障的情况下依然保障系统的性能和安全性。在下图中,你可以看到Kali Linux在安装的过程中所提供的分区选项。
5-锁定boot目录
boot目录中包含大量的重要文件,这些文件与Linux内核有关,所以你需要通过下列步骤来确保这个目录只开放了“只读”权限。首先,打开“fstab”文件。
接下来,将下图所示的最后一行数据添加进去。
这一步完成之后,你需要执行下列命令来设置该文件的拥有者:
#chown root:root /etc/fstab
接下来还需要设置一些权限来保护启动设置:
-设置/etc/grub.conf的拥有者(owner)和组(group)为root用户:
#chown root:root /etc/grub.conf
-设置/etc/grub.conf文件只有root可读写:
#chmod og-rwx /etc/grub.conf
-单用户模式需要进行身份验证:
#sed -i "/SINGLE/s/sushell/sulogin/"/etc/sysconfig/init
#sed -i "/PROMPT/s/yes/no/" /etc/sysconfig/init
6-禁用USB存储设备
根据你系统的重要程度,有时你需要禁止Linux主机使用USB存储设备。现在有很多种方法可以禁用USB存储设备,下面给大家提供的是最常用的一种:
用你最喜欢的文本编辑器打开“blacklist.conf”文件:
#nano /etc/modprobe.d/blacklist.conf
打开文件之后,将下列信息添加到文件底部,然后保存并退出:
blacklist usb_storage
然后打开rc.local文件:
#nano /etc/rc.local
添加下面这两行数据:
modprobe -r usb_storage
exit 0
7-系统更新
首次启动之后,第一件事就是更新系统,这一步应该算比较简单了。通常情况下,你可以打开终端,然后执行相应的命令即可。在Kali Linux中,你可以使用下图所示的命令进行系统更新:
8-检查已安装的package
列出你Linux系统中所有已安装的package,然后删除那些你不需要的。如果你正在操作的是一台服务器的话,那么你就要非常仔细了,因为服务器中一般只用安装必须使用的应用程序和服务。你可以通过下图所示的命令列出Kali Linux中安装的package:
请记住,禁用那些你不需要的服务可以降低服务器的攻击面。如果你在自己的Linux服务器中发现了下面这些遗留服务的话,请赶紧删除它们:
Telnet server
RSH server
NIS server
TFTP server
TALK server
9-检查开放端口
识别面向互联网的开放连接是一项非常重要的任务。在Kali Linux中,我们可以使用下图所示的命令来发现隐藏的开放端口:
10-增强SSH的安全性
没错,SSH确实是安全的,但是我们仍然要在现有的基础上继续增强它的安全性。首先,如果你可以禁用SSH的话,那么问题就解决了。但是,如果你仍然需要使用它,那么你就需要修改SSH的默认配置了。切换到目录/etc/ssh,然后打开“sshd_config”文件。
-将默认端口号(22)修改为其他的数字(例如99)。
-确保root用户无法通过SSH进行远程登录:
PermitRootLogin no
-允许某些特殊的用户:
AllowUsers [username]
如果你需要进行更加丰富的配置,请确保在阅读了SSH手册并了解文件中全部配置项的情况下进行操作。【参考资料】
除此之外,你还需要确保在“sshd_config”文件中配置下面这些额外的配置选项:
Protocol2
IgnoreRhosts to yes
HostbasedAuthentication no
PermitEmptyPasswords no
X11Forwarding no
MaxAuthTries 5
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
ClientAliveInterval 900
ClientAliveCountMax 0
UsePAM yes
最后,设置该文件的访问权限,确保只有root用户可以修改该文件的内容:
#chown root:root etc/ssh/sshd_config
#chmod 600 /etc/ssh/sshd_config
11-启用SELinux
SELinux是一种支持访问控制安全策略的内核安全机制。SELinux有三种配置模式:
Disabled: Turned-off
Permissive: Prints warnings
Enforcing: Policy is enforced
打开配置文件:
#nano /etc/selinux/config
确保SELinux已开启:
SELINUX=enforcing
12-网络参数
保护Linux主机的网络活动同样是非常重要的,永远不要指望着防火墙去帮你完成所有的任务。打开/etc/sysctl.conf文件,然后进行下列设置:
-将net.ipv4.ip_forward参数设为0。
-将net.ipv4.conf.all.send_redirects和net.ipv4.conf.default.send_redirects参数设为0。
-将net.ipv4.conf.all.accept_redirects和net.ipv4.conf.default.accept_redirects参数设为0。
-将net.ipv4.icmp_ignore_bogus_error_responses参数设为1。
13-密码策略
人们通常会在不同的地方使用相同的密码,这是一个非常不好的习惯。旧的密码保存在/etc/security/opasswd文件中,我们需要使用PAM模块来管理Linux主机中的安全策略。在Debian发行版中,可以打开/etc/pam.d/common-password文件,然后将下面的信息添加进去,这样就可以防止用户重新使用最近曾使用过的四个密码了:
auth sufficient pam_unix.so likeauthnullok
password sufficient pam_unix.so remember=4
另外一个密码策略就是强迫用户使用健壮的密码。PAM模块提供了一个库(pam_cracklib),它可以帮助你的服务器抵御字典攻击和爆破攻击。打开/etc/pam.d/system-auth文件,然后将下列信息添加进去:
/lib/security/$ISA/pam_cracklib.so retry=3 minlen=8lcredit=-1 ucredit=-2 dcredit=-2 ocredit=-1
Linux保存的是密码的哈希,所以你要确保系统使用的是SHA512哈希算法。
另外一个有趣的功能就是“密码输出错误五次之后锁定账号”。打开/etc/pam.d/password-auth文件,然后添加下列数据:
auth required pam_env.so
auth required pam_faillock.so preauth audit silent deny=5unlock_time=604800
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5unlock_time=604800
auth sufficient pam_faillock.so authsucc audit deny=5unlock_time=604800
auth required pam_deny.so
然后打开/etc/pam.d/system-auth文件,再添加下列信息:
auth required pam_env.so
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=604800
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5unlock_time=604800
auth sufficient pam_faillock.so authsucc audit deny=5unlock_time=604800
auth required pam_deny.so
密码输错五次之后,只有管理员才可以解锁这个账号,解锁命令如下:
# /usr/sbin/faillock --user <userlocked> --reset
另一个好习惯就是设置“密码九十天后过期”。
-将/etc/login.defs中的PASS_MAX_DAYS参数设为90。
-修改当前用户的密码过期时间:
#chage --maxdays 90 <user>
现在,我们还要限制su命令的访问权。打开/etc/pam.d/su文件,然后设置pam_wheel.so参数:
auth required pam_wheel.so use_uid
最后一步就是禁止非root用户访问系统账号。这一步可以通过下面这个bash脚本完成:
#!/bin/bash
for user in `awk -F: '($3 < 500) {print $1 }'/etc/passwd`; do
if [ $user != "root" ]
then
/usr/sbin/usermod -L $user
if [ $user != "sync" ] && [ $user !="shutdown" ] && [ $user != "halt" ]
then /usr/sbin/usermod -s /sbin/nologin $user
fi
fi
done
14-权限和验证
毫无疑问,如果你想要保证Linux主机的安全性,权限肯定是最重要的东西。
通过下列命令设置/etc/anacrontab、/etc/crontab和/etc/cron.*的相应权限:
#chown root:root /etc/anacrontab
#chmod og-rwx /etc/anacrontab
#chown root:root /etc/crontab
#chmod og-rwx /etc/crontab
#chown root:root /etc/cron.hourly
#chmod og-rwx /etc/cron.hourly
#chown root:root /etc/cron.daily
#chmod og-rwx /etc/cron.daily
#chown root:root /etc/cron.weekly
#chmod og-rwx /etc/cron.weekly
#chown root:root /etc/cron.monthly
#chmod og-rwx /etc/cron.monthly
#chown root:root /etc/cron.d
#chmod og-rwx /etc/cron.d
为/var/spool/cron分配适当的权限:
#chown root:root <crontabfile>
#chmod og-rwx <crontabfile>
为“passwd”、“group”、“shadow”和“gshadow”文件分配适当的权限:
#chmod 644 /etc/passwd
#chown root:root /etc/passwd
#chmod 644 /etc/group
#chown root:root /etc/group
#chmod 600 /etc/shadow
#chown root:root /etc/shadow
#chmod 600 /etc/gshadow
#chown root:root /etc/gshadow
15-额外的操作
除了上述配置之外,下面这些因素也应该纳入我们的考虑范围内。
第一:
-在/etc/security/limits.conf文件中添加“hardcore 0”;
-在/etc/sysctl.conf文件中添加“fs.suid_dumpable= 0”;
第二:
-在/etc/sysctl.conf文件中添加“kernel.exec-shield= 1”
第三:
-在/etc/sysctl.conf文件中添加“kernel.randomize_va_space= 2”;
结束语
在这篇文章中,我给大家介绍了几个能够增强Linux系统安全性的重要配置。但是,这只是冰山一角,还有很多复杂且有效的设置项还没来得及与大家分享。如果你还想了解更多关于增强Linux安全性的内容,请参考我在Pluralsight上的课程【传送门】。
Linux强化论:15步打造一个安全的Linux服务器的更多相关文章
- 大流量网站性能优化:一步一步打造一个适合自己的BigRender插件
BigRender 当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片 ...
- Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥
一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...
- 每天一个linux命令(15)-tail
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新, ...
- Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站
Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...
- 20步打造最安全的NGINX WEB服务器
Nginx 是一个轻量级的,高性能的Web服务器以及反向代理和邮箱(IMAP/POP3)代理服务器.它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Wind ...
- 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...
- 【linux】如何将Vim打造成一个成熟的IDE
如果你稍微写过一点代码,就能知道“集成开发环境”(IDE)是多么的便利.不管是Java.C还是Python,当IDE会帮你检查语法.后台编译,或者自动导入你需要的库时,写代码就变得容易许多.另外,如果 ...
- 一步一步教你如何在linux下配置apache+tomcat(转)
一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ...
随机推荐
- 关于SharePoint 2013 UserProfile跨场的几点注意
1.跨场中需要以下几个Service实例,没有这几个会遇到各种问题 2.发布场和消费场同时需要创建Host站点,否则消费场的SiteFeed无法使用. 3.跨场关注的问题请参考:http://www. ...
- Android的消息循环机制 Looper Handler类分析
Android的消息循环机制 Looper Handler类分析 Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...
- 对tableView三种计算动态行高方法的分析
tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableV ...
- YYText-显示富文本
github地址: https://github.com/ibireme/YYText CocoaPods安装: pod 'YYText' 1.YYLabel使用注意 private lazy var ...
- 限制EditText 输入的字节数
1.代码 name_tv = (EditText) findViewById( R.id.name_tv ); name_tv.addTextChangedListener(new TextWatch ...
- spring.net (1) 概念-控制反转(又名依赖注入)
Spring.net 作为一个应用程序框架,在构建企业级.net应用程序提供了很多灵活而又丰富的功能(如:依赖注入,aop,数据访问抽象,asp.net 扩展). 控制反转: Inversion of ...
- AFNetworking简单用法
GET请求 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:URL parameters:ni ...
- cocoapods卸载与安装的各种坑
在mac上安装cocoapods,一路的坑啊,无数报错啊有木有! 本以为安装很简单,mac下都自带ruby,使用ruby的gem命令即可下载安装: $ sudo gem install cocoapo ...
- django 操作 下载 excel xls xlsx csv
网站开发离不开数据的导入导出,本文将介绍一下django如何操作excel 先安装 django-excel pip install django-excel 配置一下url url(r'^downl ...
- DB2LOOK命令提取数据库对象信息
提取复制数据库的DDL语句:db2look -d BCDLJS -e -o db2look.sql -a -a:导出所有用户的DDL-o: 定向结果到文件-d: 数据库名-e: 抽取复制数据库所需的 ...