如何保证 Linux 服务器的安全

2013/09/17 | 分类: IT技术 | 0
条评论
 | 标签: LINUX服务器

分享到:53
本文由 伯乐在线 - 贾朝藤 翻译自 Spenser
Jones
。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。

【感谢 @localtest 的热心翻译。如果其他朋友也有不错的原创或译文,可以投递到伯乐在线。】

很少见有人马上为一台新安装的服务器做安全措施,然而我们生活所在的这个社会使得这件事情是必要的。不过为什么仍旧这么多人把它拖在最后?我也做过相同的事,这通常可以归结为我们想要马上去折腾那些有趣的东西。希望这篇文章将向大家展示,确保服务器安全没有你想得那样难。在攻击开始后,俯瞰你的“堡垒”,也相当享受。

这篇文章为 Ubuntu 12.04.2 LTS 而写,你也可以在任何其他 Linux 分发版上做相同的事情。

我从哪儿开始?

如果服务器已经有了一个公有IP,你会希望立即锁定 root 访问。事实上,你得锁定整个ssh访问,并确保只有你可以访问。增加一个新用户,把它加入admin组(在/etc/sudoers预配置以拥有sudo访问权限)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$
sudo

addgroup admin
Adding
group
'admin'

(GID 1001)
Done.
 
$
sudo

adduser spenserj
Adding
user `spenserj' ...
Adding
new group `spenserj' (1002) ...
Adding
new user `spenserj
'
(1001) with group `spenserj'

...
Creating
home directory `
/home/spenserj'
...
Copying
files from `
/etc/skel'
...
Enter
new UNIX password:
Retype
new UNIX password:
passwd:
password updated successfully
Changing
the user information
for

spenserj
Enter
the new value, or press ENTER
for

the default
    Full
Name []: Spenser Jones
    Room
Number []:
    Work
Phone []:
    Home
Phone []:
    Other
[]:
Is
the information correct? [Y
/n]
y
 
$
sudo

usermod

-a -G admin spenserj

你也将希望在你电脑上创建一个私有key,并且在服务器上禁用讨厌的密码验证。

1
2
$
mkdir

~/.
ssh
$
echo

"ssh-rsa [your public key]"

> ~/.
ssh/authorized_keys

/etc/ssh/sshd_config

1
2
3
4
PermitRootLogin
no
PermitEmptyPasswords
no
PasswordAuthentication
no
AllowUsers
spenserj

重新加载SSH,使用修改生效,之后尝试在一个新会话中登陆来确保所有事情正常工作。如果你不能登陆,你将仍然拥有你的原始会话来做修改。

1
2
3
$
sudo

service
ssh

restart
ssh

stop
/waiting
ssh

start
/running,
process 1599

更新服务器

既然你是访问服务器的唯一用户,你就不用担心黑客鬼鬼祟祟进入,再次正常呼吸。当有一些针对你服务器的更新时,正是修补的机会,所以动手吧,就现在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$
sudo apt-get update
...
Hit
http://ca.archive.ubuntu.com precise-updates/universe Translation-en_CA
Hit
http://ca.archive.ubuntu.com precise-updates/universe Translation-en
Hit
http://ca.archive.ubuntu.com precise-backports/main Translation-en
Hit
http://ca.archive.ubuntu.com precise-backports/multiverse Translation-en
Hit
http://ca.archive.ubuntu.com precise-backports/restricted Translation-en
Hit
http://ca.archive.ubuntu.com precise-backports/universe Translation-en
Fetched
3,285 kB in 5s (573 kB/s)
Reading
package lists... Done
 
$
sudo apt-get upgrade
Reading
package lists... Done
Building
dependency tree
Reading
state information... Done
The
following packages have been kept back:
  linux-headers-generic-lts-quantal
linux-image-generic-lts-quantal
The
following packages will be upgraded:
  accountsservice
apport apt apt-transport-https apt-utils aptitude bash ...
73
upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
Need
to get 61.0 MB of archives.
After
this operation, 151 kB of additional disk space will be used.
Do
you want to continue [Y/n]? Y
...
Setting
up libisc83 (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up libdns81 (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up libisccc80 (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up libisccfg82 (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up libbind9-80 (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up liblwres80 (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up bind9-host (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up dnsutils (1:9.8.1.dfsg.P1-4ubuntu0.6) ...
Setting
up iptables (1.4.12-1ubuntu5) ...
...

安装防火墙

安装现在正最流行的防火墙软件?好,行动吧。那就配置一个防火墙。之后你总是可以增加另一个异常,几分钟额外的工作并不会折腾死你。Iptables在Ubuntu里预装了,所以去设置一些规则吧。

1
$
sudo

mkdir

/etc/iptables

/etc/iptables/rules

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
*filter
:INPUT
DROP [0:0]
:FORWARD
DROP [0:0]
:OUTPUT
DROP [0:0]
 
#
Accept any related or established connections
-I
INPUT  1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-I
OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
 
#
Allow all traffic on the loopback interface
-A
INPUT  -i lo -j ACCEPT
-A
OUTPUT -o lo -j ACCEPT
 
#
Allow outbound DHCP request - Some hosts (Linode) automatically assign the primary IP
#-A
OUTPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT
 
#
Outbound DNS lookups
-A
OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT
 
#
Outbound PING requests
-A
OUTPUT -p icmp -j ACCEPT
 
#
Outbound Network Time Protocol (NTP) request
-A
OUTPUT -p udp --dport 123 --sport 123 -j ACCEPT
 
#
SSH
-A
INPUT  -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
 
#
Outbound HTTP
-A
OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A
OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
 
COMMIT

通过 iptables-apply 命令为规则集生效。如果你丢失连接,修补你的规则,在继续之前再试一下

1
2
3
4
$
sudo

iptables-apply
/etc/iptables/rules
Applying
new ruleset...
done.
Can
you establish NEW connections to the machine? (y
/N)
y
...
then

my job is
done.
See you next
time.

创建文件 /etc/network/if-pre-up.d/iptables,然后写入下面内容。当你启动服务器的时候,将自动载入你的iptables规则。

/etc/network/if-pre-up.d/iptables

1
2
#!/bin/sh
iptables-restore
<
/etc/iptables/rules

现在给它执行权限,执行文件,以确保它正常载入

1
2
$
sudo

chmod

+x
/etc/network/if-pre-up.d/iptables
$
sudo

/etc/network/if-pre-up
.d/iptables

用 Fail2ban 处理潜在黑客

当谈到安全的时,Fail2ban 是我最喜欢的工具之一,它将监控你的日志文件,并且可以临时禁止那些正在滥用你资源,或者正在强制肆虐你的SSH连接,或者正在dos攻击你web服务器的用户。

Install Fail2ban

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$
sudo

apt-get
install

fail2ban
[sudo]
password
for

sjones:
Reading
package lists... Done
Building
dependency tree
Reading
state information... Done
The
following extra packages will be installed:
  gamin
libgamin0 python-central python-gamin python-support whois
Suggested
packages:
  mailx
The
following NEW packages will be installed:
  fail2ban
gamin libgamin0 python-central python-gamin python-support whois
0
upgraded, 7 newly installed, 0 to remove and 2 not upgraded.
Need
to get 254 kB of archives.
After
this operation, 1,381 kB of additional disk space will be used.
Do
you want to
continue

[Y
/n]?
y
...

虽然 Fail2ban 安装一个默认配置(/etc/fail2ban/jail.conf),但我们希望在 /etc/fail2ban/jail.local 写配置,所以把它拷贝到那儿。

1
sudo

cp

/etc/fail2ban/jail
.{conf,local}

配置

把 ignoreip 行修改为你的ip,并且可以设置禁止恶意用户的时间量(默认是10分钟)。你也将希望设置一个destemail,这里我通常输入我自已的email地址,再在后面加上 ,fail2ban@blocklist.de。BlockList.de 是一个跟踪并且自动报告黑客IP的系统。

/etc/fail2ban/jail.local

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[DEFAULT]
 
#
"ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip
= 127.0.0.1
/8
bantime 
= 600
maxretry
= 3
 
#
"backend" specifies the backend used to get files modification. Available
#
options are "gamin", "polling" and "auto".
#
yoh: For some reason Debian shipped python-gamin didn't work as expected
#     
This issue left ToDo, so polling is default backend for now
backend
= auto
 
#
#
Destination email address used solely for the interpolations in
#
jail.{conf,local} configuration files.
destemail
= root@localhost,fail2ban@blocklist.de

这有一些其他的你想检查的配置,尽管缺省配置已经相当不错了,所以,快速浏览这些,直到你读到Actions章节。

Actions

Actions 允许你对恶意行为作出反应,然而当我们想要它禁止和发邮件的时候,默认是禁用了 iptables。值得感谢的是,有一个预配置文件 action_wml,它恰恰是做这个的。

/etc/fail2ban/jail.local

1
2
3
4
#
Choose default action.  To change, just override value of 'action' with the
#
interpolation to the chosen action shortcut (e.g.  action_mw, action_mwl, etc) in jail.local
#
globally (section [DEFAULT]) or per specific section
action
= %(action_mwl)s

Jails 监控

为了让Fail2ban工作,需要了解要监控哪些东西。这些已在Jails部分的配置文件,并且这有一些预载入而未启用的例子。既然到目前为止,你仅仅在服务器上启用了SSH访问,那我们就只启用SSH和SSH-DDos 监控,然而你还是会想给安装在这台服务器上的公共访问服务增加新的监控。

/etc/fail2ban/jail.local

1
2
3
4
5
6
7
8
9
10
11
12
[ssh]
enabled 
= true
port    
= ssh
filter  
= sshd
logpath 
= /var/log/auth.log
maxretry
= 6
[ssh-ddos]
enabled 
= true
port    
= ssh
filter  
= sshd-ddos
logpath 
= /var/log/auth.log
maxretry
= 6

让变化生效

既然我们已经配置了Fail2ban,你将希望重新载入它,并且确保向iptables增加了合适的规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$
sudo

service fail2ban restart
 *
Restarting authentication failure monitor fail2ban
   ...done.
 
$
sudo

iptables -L
Chain
INPUT (policy DROP)
target    
prot opt
source              

destination
fail2ban-ssh-ddos 
tcp  --  anywhere             anywhere             multiport dports
ssh
fail2ban-ssh 

tcp  --  anywhere             anywhere             multiport dports
ssh
...
Chain
fail2ban-
ssh

(1 references)
target    
prot opt
source              

destination
RETURN    
all  --  anywhere             anywhere
 
Chain
fail2ban-
ssh-ddos
(1 references)
target    
prot opt
source              

destination
RETURN    
all  --  anywhere             anywhere

在任何时间,你都可以使用sudo iptables -L 来列出你的规则,随后列出所有当前禁止的 IP。此时,Fail2ban正在处理两个恶意的用户。

Banned IPs

1
2
DROP      
all  --  204.50.33.22         anywhere
DROP      
all  --  195.128.126.114      anywhere

保持最新更新

你可能现在拥有一个已经锁定并且准备投入使用的服务器,然而这并不是你安全之旅的终点。保持最新更新(并且总是首先在非产品环境下测试),总是关闭你不需要的端口,定期检查你的日志,并且由内而外了解你的服务器。

HackerNews 上的讨论

我的这篇文章,在 HackerNews 上有一些很好的评论,如果你对不同观点和更好的安全性感兴趣的话,我建议你去看看。这篇文章目的是作为服务器安全的新手指南,在这篇文章结束的时候,并不意味着你的服务器是无懈可击的。用本文来快速锁定一个新服务器,在它之上为你特有的情况建立其他措施。你可能希望查询
IPV6 安全,改变你的SSH端口(通过隐藏达到安全目的),安全内核(SELinux和GRSecurity),跟踪系统改变,并且如果你的服务器曾经不安全或已经在线相当长时间了的话,全面检查一番。一台服务器有好几百个入口点,并且每一个你安装的应用都带来了额外的潜在漏洞,但是通过合适的工具,你可以免去困扰,直接去睡大觉了。

 (1 个评分,平均: 5.00)

原文链接: Spenser Jones   翻译: 伯乐在线贾朝藤

译文链接: http://blog.jobbole.com/48195/

[ 转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]

如何保证 Linux 服务器的安全的更多相关文章

  1. 《Linux服务器的监控》

    本文地址:http://www.cnblogs.com/aiweixiao/p/7131532.html 原文地址(公众号):http://t.cn/RKwmqUs 点击关注 微信公众号 1. 监控概 ...

  2. linux下的ssh工具之,本地上传到linux服务器and Linux服务器文件另存为本地。非sftp工具。

    首先,当你只有一个ssh工具可以连接linux,但你有想把文件在 linux 和windows(本地)直接的切换.其实可以的: 本文参考 1.将本地的文件,放到ssh远程的linux服务器上: 首先要 ...

  3. CentOS Linux服务器安全设置

    转自:http://www.osyunwei.com/archives/754.html 引言: 我们必须明白:最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关 ...

  4. windows下运行的linux服务器批量管理工具(带UI界面)

    产生背景: 由于做服务器运维方面的工作,需要一人对近千台LINUX服务器进行统一集中的管理,如同时批量对LINUX服务器执行相关的指令.同时批量对LINUX服务器upload程序包.同时批量对LINU ...

  5. 1.linux服务器的性能分析与优化

    [教程主题]:1.linux服务器的性能分析与优化 [课程录制]: 创E [主要内容] [1]影响Linux服务器性能的因素 操作系统级 CPU 目前大部分CPU在同一时间只能运行一个线程,超线程的处 ...

  6. linux服务器分析优化

    转:http://jiekeyang.blog.51cto.com/11144634/1774473 一.系统性能分析 1.系统的性能是指操作系统完成任务的有效性.稳定性和响应速度.操作系统完成任务与 ...

  7. (转)linux服务器安全配置攻略

    引言: 最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置,供大家参考. ...

  8. Linux强化论:15步打造一个安全的Linux服务器

    Linux强化论:15步打造一个安全的Linux服务器 Alpha_h4ck2016-11-30共28761人围观 ,发现 8 个不明物体专题系统安全 可能大多数人都觉得Linux是安全的吧?但我要告 ...

  9. 20个Linux服务器安全强化建议(一)

    Linux服务器安全对于保护用户数据.知识产权非常重要,同时还能减少你面对黑客的时间.在工作中,通常由系统管理员对Linux的安全负责,在这篇文章中,介绍了20条对Linux系统进行强化的建议.本文所 ...

随机推荐

  1. NGUI发布后UI层看不见的解决办法

    NGUI发布后UI层看不见的解决办法 提示信息:You can'tplace widgets on a layer different than the UIPanel that manages th ...

  2. Context - React跨组件访问数据的利器

    Context提供了一种跨组件访问数据的方法.它无需在组件树间逐层传递属性,也可以方便的访问其他组件的数据 在经典的React应用中,数据是父组件通过props向子组件传递的.但是在某些特定场合,有些 ...

  3. 如何指定GCC的默认头文件路径

    如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:)原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631============ ...

  4. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第七篇【元素定位介绍】

    http://blog.csdn.net/deadgrape/article/details/50628113 我想大家在玩自动化的时候最关心的一定是如何定位元素,因为元素定位不到后面的什么方法都实现 ...

  5. ie版本

    <!--[if lte IE 6]> 自定义代码 <![endif]-->

  6. 关系数据库标准语言SQL

    篇幅过长,恐惧者慎入!!!基础知识,大神请绕道!!! 本节要点: l  SQL概述 l  学生-课程关系 l  数据定义 基本表的定义.删除与修改 索引的建立与删除 l  查询 单表查询 连接查询 嵌 ...

  7. java中继承关系学习小结

    继承:把多个类中同样的内容提取出来.定义到一个类中,其它类仅仅须要继承该类.就能够使用该类公开的属性和公开的方法.   继承的优点:提高代码的复用性.提高代码的可维护性.让类与类之间产生关系,是多态存 ...

  8. [Ionic] Align and Size Text with Ionic CSS Utilities

    The Ionic framework provides several built-in CSS Utilities or directives that you can leverage when ...

  9. SqlCommand.DeriveParameters failed

    错误信息例如以下: SqlCommand.DeriveParameters failed because the SqlCommand.CommandText property value is an ...

  10. CRM实施中应避免的5大问题

    越来越多的人认识到,杂乱的客户信息应该统一管理.曾经人们用excel表格甚至是纸笔来记录客户信息,可是假设想知道这个客户我们销售接触过几次?邮件里都谈了什么?在线客服都和客户聊了什么?报价单发的啥价格 ...