对于开放式的操作系统---Linux,系统的安全设定包括系统服务最小化、限制远程存取、隐藏重要资料、修补安全漏洞、采用安全工具以及经常性的安全检 查等。本文主要从用户设置、如何开放服务、系统优化等方面进行系统的安全配置,以到达使Linux服务器更安全、稳定。

2.用户管理
在 Linux系统中,用户帐号是用户的身份标志,它由用户名和用户口令组成。系统将输入的用户名存放在/etc/passwd文件中,而将输入的口令以加密 的形式存放在/etc/shadow文件中。在正常情况下,这些口令和其他信息由操作系统保护,能够对其进行访问的只能是超级用户(root)和操作系统 的一些应用程序。但是如果配置不当或在一些系统运行出错的情况下,这些信息可以被普通用户得到。进而,不怀好意的用户就可以使用一类被称为“口令破解”的 工具去得到加密前的口令。

2.1 删除系统特殊的的用户帐号和组帐号:
#userdel username

userdel adm

userdel lp

userdel sync

userdel shutdown

userdel halt

userdel news

userdel uucp

userdel operator

userdel games

userdel gopher

以上所删除用户为系统默认创建,但是在常用服务器中基本不使用的一些帐号,但是这些帐号常被黑客利用和攻击服务器。

#groupdel username

groupdel adm

groupdel lp

groupdel news

groupdel uucp

groupdel games

groupdel dip

同样,以上删除的是系统安装是默认创建的一些组帐号。这样就减少受攻击的机会。

2.2 用户密码设置:
安装linux时默认的密码最小长度是5个字节,但这并不够,要把它设为8个字节。修改最短密码长度需要编辑login.defs文件(vi /etc/login.defs)

PASS_MAX_DAYS 99999 ##密码设置最长有效期(默认值)

PASS_MIN_DAYS 0 ##密码设置最短有效期

PASS_MIN_LEN 5 ##设置密码最小长度

PASS_WARN_AGE 7 ##提前多少天警告用户密码即将过期。

2.3 修改自动注销帐号时间:
自 动注销帐号的登录,在Linux系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户,那将会带来很大的安全隐患,应 该让系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。TMOUT按秒计算。编辑你的profile文件(vi /etc/profile),在"HISTSIZE="后面加入下面这行:
TMOUT=300
300,表示300秒,也就是表示5分钟。这样,如果系统中登陆的用户在5分钟内都没有动作,那么系统会自动注销这个账户。

2.4 给系统的用户名密码存放文件加锁:
chattr +i /etc/passwd

chattr +i /etc/shadow

chattr +i /etc/gshadow

chattr +i /etc/group

注:chattr是改变文件属性的命令,参数i代表不得任意更动文件或目录,此处的i为不可修改位(immutable)。查看方法:lsattr /etc/passwd

3.服务管理
在Linux系统的服务管理方面,如果想做到服务的最好安全,其中主要的就是升级服务本身的软件版本,另外一个就是关闭系统不使用的服务,做到服务最小化。

3.1 关闭系统不使用的服务:
cd /etc/init.d ##进入到系统init进程启动目录

在这里有两个方法,可以关闭init目录下的服务,一、将init目录下的文件名mv成*.old类的文件名,即修改文件名,作用就是在系统启动的时候找不到这个服务的启动文件。二、使用chkconfig系统命令来关闭系统启动等级的服务。

注:在使用以下任何一种方法时,请先检查需要关闭的服务是否是本服务器特别需要启动支持的服务,以防关闭正常使用的服务。

第一种:修改文件名的方法

Cd /etc/init.d/

mv apmd apmd.old ##笔记本需要

mv netfs netfs.old ## nfs客户端

mv yppasswdd yppasswdd.old ## NIS服务器,此服务漏洞很多

mv ypserv ypserv.old ## NIS服务器,此服务漏洞很多
mv dhcpd dhcpd.old ## dhcp服务

mv portmap portmap.old ##运行rpc(111端口)服务必需

mv lpd lpd.old ##打印服务

mv nfs nfs.old ## NFS服务器,漏洞极多

mv sendmail sendmail.old ##邮件服务, 漏洞极多

mv snmpd snmpd.old ## SNMP,远程用户能从中获得许多系统信息

mv rstatd rstatd.old ##避免运行r服务,远程用户可以从中获取很多信息

mv atd atd.old ##和cron很相似的定时运行程序的服务

第二种:使用chkcofig命令来关闭不使用的系统服务

chkconfig --level 35 apmd off

chkconfig --level 35 netfs off

chkconfig --level 35 yppasswdd off

chkconfig --level 35 ypserv off

chkconfig --level 35 dhcpd off

chkconfig --level 35 portmap off

chkconfig --level 35 lpd off
chkconfig --level 35 cups off

chkconfig --level 35 nfs off

chkconfig --level 35 sendmail off

chkconfig --level 35 snmpd off

chkconfig --level 35 rstatd off

chkconfig --level 35 atd off

注:以上chkcofig 命令中的3和5是系统启动的类型,3代表系统的多用启动方式,5代表系统的X启动方式。

3.2 给系统服务端口列表文件加锁
主要作用:防止未经许可的删除或添加服务

chattr +i /etc/services

3.3 修改ssh服务的root登录权限
修改ssh服务配置文件,使的ssh服务不允许直接使用root用户来登录,这样建设系统被恶意登录攻击的机会。

vi /etct/ssh/sshd_config

PermitRootLogin yes

将这行前的#去掉后,修改为:PermitRootLogin no

4.系统文件权限
Linux 文件系统的安全主要是通过设置文件的权限来实现的。每一个Linux的文件或目录,都有3组属性,分别定义文件或目录的所有者,用户组和其他人的使用权限 (只读、可写、可执行、允许SUID、允许SGID等)。特别注意,权限为SUID和SGID的可执行文件,在程序运行过程中,会给进程赋予所有者的权 限,如果被黑客发现并利用就会给系统造成危害。

4.1 修改init目录文件执行权限:
chmod -R 700 /etc/init.d/*

4.2 修改部分系统文件的SUID和SGID的权限:
chmod a-s /usr/bin/chage

chmod a-s /usr/bin/gpasswd

chmod a-s /usr/bin/wall

chmod a-s /usr/bin/chfn

chmod a-s /usr/bin/chsh

chmod a-s /usr/bin/newgrp

chmod a-s /usr/bin/write

chmod a-s /usr/sbin/usernetctl

chmod a-s /usr/sbin/traceroute

chmod a-s /bin/mount

chmod a-s /bin/umount

chmod a-s /bin/ping

chmod a-s /sbin/netreport

4.3 修改系统引导文件
chmod 600 /etc/grub.conf

chattr +i /etc/grub.conf

5.系统优化
5.1 虚拟内存优化:
一般来说,linux的物理内存几乎是完全used。这个和windows非常大的区别,它的内存管理机制将系统内存充分利用,并非windows无论多大的内存都要去使用一些虚拟内存一样。

在/proc/sys/vm/freepages中三个数字是当前系统的:最小内存空白页、最低内存空白页和最高内存空白。

注 意,这里系统使用虚拟内存的原则是:如果空白页数目低于最高空白页设置,则使用磁盘交换空间。当达到最低空白页设置时,使用内存交换。内存一般以每页4k 字节分配。最小内存空白页设置是系统中内存数量的2倍;最低内存空白页设置是内存数量的4倍;最高内存空白页设置是系统内存的6倍。

以下以 1G内存为例修改系统默认虚拟内存参数大小:

echo "2048 4096 6444" >/proc/sys/vm/freepages














6.日志管理
6.1 系统引导日志:
dmesg
使用 dmesg 命令可以快速查看最后一次系统引导的引导日志。通常它的

内容会很多,所以您往往会希望将其通过管道传输到一个阅读器。

6.2 系统运行日志:
A、Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有 root 才可以读,不过只需要修改文件的访问权限就可以让其他人可读。

以下是常用的系统日志文件名称及其描述:

lastlog 记录用户最后一次成功登录时间

loginlog 不良的登陆尝试记录

messages 记录输出到系统主控台以及由syslog系统服务程序产生的消息

utmp 记录当前登录的每个用户

utmpx 扩展的utmp

wtmp 记录每一次用户登录和注销的历史信息 wtmpx 扩展的wtmp

vold.log 记录使用外部介质出现的错误

xferkig 记录Ftp的存取情况 sulog 记录su命令的使用情况

acct 记录每个用户使用过的命令

aculog 拨出自动呼叫记录

B、/var/log/messages
messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在 messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。

C、/var/log/XFree86.0.log
这个日志记录的是 Xfree86 Xwindows 服务器最后一次执行的结果。如果您在启动到图形模式时遇到了问题,一般情况从这个文件中会找到失败的原因。

D、 在/var/log 目录下有一些文件以一个数字结尾,这些是已轮循的归档文件。日志文件会变得特别大,特别笨重。Linux 提供了一个命令来轮循这些日志,以使您的当前日志信息不会淹没在旧的无关信息之中。 logrotate 通常是定时自动运行的,但是也可以手工运行。当执行后,logrotate 将取得当前版本的日志文件,然后在这个文件名最后附加一个“ .1”。其他更早轮循的文件为“ .2”、“ .3”,依次类推。文件名后的数字越大,日志就越老。

可以通过编辑 /etc/logrotate.conf 文件来配置 logrotate 的自动行为。通过 man logrotate 来学习 logrotate 的全部细节。

其中:

# rotate log files weekly

weekly

这里代表每个日志文件是每个星期循环一次,一个日志文件保存一个星期的内容。

# keep 4 weeks worth of backlogs

rotate 4

这里代表日志循环的次数是4次,即可以保存4个日志文件。

E、定制日志

可以通过编辑 /et/syslog.conf 和 /etc/sysconfig/syslog 来配置它们的行为,可以定制系统日志的存放路径和日志产生级别。

6.3 系统各用户操作日志:
last

单独执行last指令,它会读取位于/var/log目录下,名称为wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。

history

history 命令能够保存最近所执行的命令。如果是root命令所保存的命令内容在/root/.bash_history文件中,如果是普通用户,操作所命令保存在 这个用户的所属目录下,即一般的/home/username/.bash_history。这个history的保存值可以设置,编辑/etc /profile文件,其中的HISTSIZE=1000的值就是history保存的值。

7.防火墙
7.1 iptables类型防火墙:
7.1.1 iptables概念:
Iptalbes(IP包过滤器管理)是用来设置、维护和检查Linux内核的IP包过滤规则的。

可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。

通 过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或具有 某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP 或 REJECT 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。

根据规则所处理的信息包的类型,可以将规则分 组在链中。处理入站信息包的规则被添加到 INPUT 链中。处理出站信息包的规则被添加到 OUTPUT 链中。处理正在转发的信息包的规则被添加到 FORWARD 链中。这三个链是基本信息包过滤表中内置的缺省主链。另外,还有其它许多可用的链的类型(如 PREROUTING 和 POSTROUTING),以及提供用户定义的链。每个链都可以有一个策略,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不 匹配时,执行此操作。

建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。

如 果信息包源自外界并前往系统,而且防火墙是打开的,那么内核将它传递到内核空间信息包过滤表的 INPUT 链。如果信息包源自系统内部或系统所连接的内部网上的其它源,并且此信息包要前往另一个外部系统,那么信息包被传递到 OUTPUT 链。类似的,源自外部系统并前往外部系统的信息包被传递到 FORWARD 链。

7.1.2 iptables实例1:
#!/bin/sh

# 禁止系统的转发包功能

echo 0 > /proc/sys/net/ipv4/ip_forward

# 清楚iptables原有规则,并设置iptables默认规则

iptables -t nat -F POSTROUTING

iptables -t nat -F PREROUTING

iptables -t nat -F OUTPUT

iptables -F

iptables -P INPUT DROP

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

# 在input规则中需要打开的tcp、upd端口

iptables -A INPUT -j ACCEPT -p tcp --dport 80

iptables -A INPUT -j ACCEPT -p tcp --dport 22

iptables -A INPUT -j ACCEPT -p tcp --dport 25

iptables -A INPUT -j ACCEPT -p tcp --dport 1352

iptables -A INPUT -p udp --destination-port 53 -j ACCEPT

# 在input规则中状态为:STATE RELATED 的包都接受

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 启用系统ip转发功能

echo 1 > /proc/sys/net/ipv4/ip_forward

< --end-- >

7.1.3 iptables实例2:
注:这个实例中,只需要设置tcp、udp端口和服务器网络段ip范围即可,其他已经默认设置好。

#!/bin/sh

# make:yongzhang

# time: 2004-06-18

# e-mail: [email protected]








PATH=/sbin:/bin:/usr/sbin:/usr/bin

##tcp allow ports

TPORTS="80 22"

##udp allow ports

UPORTS="53"

##internal server_ip range

SERVER_IP="172.18.10.0/24"

##disable forwarding

echo 0 > /proc/sys/net/ipv4/ip_forward

##reset default policies

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -t nat -P PREROUTING ACCEPT

iptables -t nat -P POSTROUTING ACCEPT

iptables -t nat -P OUTPUT ACCEPT

## del all iptables rules

iptables -F INPUT

iptables -F FORWARD

iptables -F OUTPUT

##clean all non-default chains

iptables -X

iptables -t nat -X

##iptables default rules

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

##allow ping packets

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

#iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -m limit --limit 5/s -j ACCEPT

iptables -A FORWARD -p ICMP -j ACCEPT

##enable forwarding

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

##STATE RELATED for router

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

##accept internal packets on the internal i/f

iptables -A INPUT -s $SERVER_IP -p tcp -j ACCEPT

##open ports on router for server/services

##TCP PORTS

for ATP in $TPORTS

do

iptables -A INPUT ! -s $SERVER_IP -d $SERVER_IP -p tcp --destination-port $ATP -j ACCEPT

iptables -A FORWARD -p tcp --destination-port $ATP -j ACCEPT

done

##UDP PORTS

for AUP in $UPORTS

do

iptables -A INPUT -p udp --destination-port $AUP -j ACCEPT

iptables -A FORWARD -p udp --destination-port $AUP -j ACCEPT

done

##bad_packets chain

##drop INVALID packets immediately

iptables -A INPUT -p ALL -m state --state INVALID -j DROP

##limit SYN flood

#iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

##deny all ICMP packets,eth0 is external net_eth

#iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p ICMP -j DROP

##allow loopback

iptables -A INPUT -i lo -p all -j ACCEPT

iptables -A OUTPUT -o lo -p all -j ACCEPT

##enable forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

< --end-- >

7.2 ipchains类型防火墙:
7.2.1 ipchains概念:
Ipchains 被用来安装、维护、检查Linux内核的防火墙规则。规则可以分成四类:IP input链、IP output链、IP forward链、user defined 链。

一 个防火墙规则指定包的格式和目标。当一个包进来时, 核心使用input链来决定它的命运。 如果它通过了, 那么核心将决定包下一步该发往何处(这一步叫路由)。假如它是送往另一台机器的, 核心就运用forward链。如果不匹配,进入目标值所指定的下一条链,那有可能是一条user defined链,或者是一个特定值: ACCEPT,DENY,REJECT,MASQ,REDIRECT,RETURN。

ACCEPT意味着允许包通过,DENY 扔掉包就象没有受到过一样,REJECT也把包扔掉,但(假如它不是 ICMP 包)产生一个 ICMP 回复来告诉发包者,目的地址无法到达(请注意DENY和REJECT对于ICMP包是一样的)。
MASQ 告诉核心伪装此包,它只对forward 链和user defined链起作用,想让它起作用, 编译核心时必需让 IP Masquerading 起作用。
REDIRECT只对input链和user defined链起作用。它告诉核心把无论应送到何处的包改送到一个本地端口. 只有 TCP 和 UDP 协议可以使用此指定. 任意用 '-j REDIRECT' 指定一个端口(名字或编号)可以使送往此的包被重定向到某个特殊的端口, 即使它被标记为送到其它端口。想让它起作用,编译内核时,必须让CONFIG_IP_TRANSPARENT_PROXY起作用。
最后的一个目标指定是 RETURN, 它跳过它下面的所有规则, 直到链的末尾。
任何其它的目标指定表示一个用户自定义的链。包将在那个链中通过. 假如那个链没有决定此包的命运, 那么在那个链中的传输就完成了,包将通过当前链的下一个规则。

7.2.2 ipchains实例:
##清除input规则的规则,并改变input默认的规则链策略为REJECT

-F input

-P input REJECT

##以下是允许input规则链的tcp端口为:80 81 22 123

-A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT

-A input -s 0/0 -d 0/0 81 -p tcp -y -j ACCEPT

-A input -s 0/0 -d 0/0 22 -p tcp -y -j ACCEPT

-A input -s 0/0 -d 0/0 123 -p udp -j ACCEPT



##设置除了以上允许的input规则链以为,拒绝0-1023、2049、6000-6009、7100的tcp和upd端口,

-A input -p tcp -s 0/0 -d 0/0 0:1023 -y -j REJECT

-A input -p tcp -s 0/0 -d 0/0 2049 -y -j REJECT

-A input -p udp -s 0/0 -d 0/0 0:1023 -j REJECT

-A input -p udp -s 0/0 -d 0/0 2049 -j REJECT

-A input -p tcp -s 0/0 -d 0/0 6000:6009 -y -j REJECT

-A input -p tcp -s 0/0 -d 0/0 7100 -y -j REJECT

##允许系本身统网卡上发生的所有包通过

-A input -s 0/0 -d 0/0 -i lo -j ACCEPT

-A input -s 0/0 -d 0/0 -i eth0 -j ACCEPT

-A input -s 0/0 -d 0/0 -i eth1 -j ACCEPT

##清除output规则的规则,并改变output默认的规则链策略为ACCEPT

-F output

-P output ACCEPT

##清除forward规则的规则,并改变forward默认的规则链策略为DENY,设置了forward规则链允许对 10.10.11.0/24网段的包可以转发并且做伪装处理。

-F forward

-P forward DENY

-A forward -s 10.10.11.0/24 -j MASQ