Linux系统安全加固(一)

    去年8月,某所网站遭黑客攻击瘫痪虽然港交所随后及时启用备用系统,但还是致使7支股票1支债卷被迫停牌,次日再次遭受攻击而瘫痪;在去年年底继CSDN信息安全出现之后,网上更是传出包括人人网等多家公司的用户被公开,日益凸显的网络安全事件说明了目前基础网络还面临着诸多威胁,木马僵尸网络终端恶意软件, 跨境化网络攻击都是直接威胁。因此,确保系统安全变得尤为重要,接下来在具体介绍Linux系统的安全性之前,首先介绍一些信息安全的基础知识,这些基础知识看似枯燥,但对于今后加固Linux系统,保证系统安全运行尤为重要。
一、Linux的安全机制
    近年来,Linux系统由于其出色的性能和稳定性、开放源代码的灵活性和可扩展性,以及较低廉的成本,而受到计算机工业界的广泛关注和应用。在安全性方面,Linux内核提供了经典的Unix自主访问控制(root用户、用户ID安全机制), 以及部分支持了POSIX.1e标准草案中的Capabilities安全机制。自主访问控制(Discretionary Access Control,DAC)是指主体对客体的访问权限是由客体的属主或超级用户决定的,而且此权限一旦确定,将作为以后判断主体对客体是否有及有什么权限的惟一依据。只有客体的属主或超级用户才有权更改这些权限。传统Linux系统提供DAC支持,客体在Linux系统当中主要是指文件、目录等系统资源,主体是指访问这些资源的用户或进程。控制粒度为客体的拥有者、属组和其他人。下面就这样模型的三个要素,即客体(文件)、主体(文件)和访问权限一一介绍。
1.文件系统及访问权限
    Linux为每个文件都分配了一个文件所有者,称为文件主,并赋予文件主惟一的注册名。对文件的控制取决于文件主或超级用户(root)。文件或目录的创建者对所创建的文件或目录拥有特别使用权,文件的所有关系是可以改变的,文件或目录的所有权可以转让给其它用户,但只有文件主或root用户才有权改变文件的所有关系。
   文件的所有权标志是用户ID(UID)。chown命今可以更改某个文件或目录的所有权。例如,超级用户把自己的一个文件拷贝给用户cg,为了让用户cg能够存取这个文件,超级用户(root)应该把这个文件的属主设为cg,否则,用户cg就无法存取这个文件。
chown命令的语法格式如下:
chown [cfhvR] 用户 或 组 [文件1] [文件2]....
    用户可以是用户名或用户ID。文件是以空格分开的、要改变权限的文件列表,可以用通配符表示文件名。如果改变了文件或目录的所有权,原文件主将不再拥有该文件或目录的权限。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的目录下以后,让用户拥有使用该文件的权限。
    在Linux下,每个文件又同时属于一个用户组。当创建一个文件或目录时,系统就会赋予它一个用户组关系,用户组的所有成员都可以使用此文件或目录。文件用户组关系的标志是GID。文件的GID只能由文件主或超级用户(root)来修改。chgrp命令可以改变文件或目录的拥有者或所属群组,其语法格式如下:
chgrp  [cfhRv]  group文件名或目录
其中,group是用户组ID;文件名是以空格分开的,它支持通配符。
    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问及操作。访问权限规定三种不同类型的用户,即文件主(owner)、同组用户(group)、可以访问系统的其它用户(others)。访问权限规定三种访问文件或目录的方式,即读 (r)、写 (w)、可执行 (x)。
    对于文件,读权限(r)表示只允许指定用户读其内容,而禁止对其做任何的更改操作。将所访问的文件内容作为输入的命令需要有读的权限,例如命令more、head、cat等。写权限(w)表示允许指定用户打开并修改文件,例如命令cp、vi、mv等。执行权限(x)允许指定用户将该文件作为一个程序执行。可以使用“ls -l”查看一个文件的详细属性。
# ls -l /etc/passwd         
-rw-r--r-- 1 root root 1606 Aug 25 20:10 /etc/passwd
  对于目录,读权限(r)可以列出存储在该目录下的文件,即读目录内容列表。这一权限允许Shell使用文件扩展名字符列出相匹配的文件名。写权限(w)表示允许从目录中删除或添加新的文件,通常只有目录主才有写权限。执行权限(x)允许在目录中查找,并能用cd命令将工作目录改到该目录。使用“ls - ld”命令可以查看一个目录的详细属性。
# ls -ld /var
drwxr-xr-x 14 root root 360 Aug 25 20:30 /var
二、用户和账号管理
    Linux是一个多用户系统,因此对用户的管理是系统管理的基本组成部分。安装Linux的用户很可能就是该系统的管理员,也就是权限最高的root。通过对用户的管理,分清了用户之间的责、权、利,保证了系统安全。对于如何添加和删除一个用户等常规的管理,这里就不再赘述了,下面重点介绍一下同用户管理关系密切的几个配置文件。
1. /etc/passwd文件
  用“ls -l”命令可以看到该文件属主是root用户,只有root用户能对该文件进行写操作,其它用户只能进行读的操作。
/etc/passwd文件当中以行为单位,每行是一个记录保存一个用户的信息,参数之间用冒号隔开,用cat可以查看其内容。
# cat /etc/passwd
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
cyrus:x:96:12:User for cyrus-imapd:/usr/lib/cyrus:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
dhcpd:x:102:65534:DHCP server daemon:/var/lib/dhcp:/bin/false
ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
games:x:12:100:Games account:/var/games:/bin/bash
gdm:x:50:106:Gnome Display Manager daemon:/var/lib/gdm:/bin/false
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
notes:x:500:500::/home/notes:/bin/bash
....................
上面代码
   第一列是用户名;
   第二列是用户的密码;
   第三列是用户的数字ID,即用户的UID;
   第四列是用户的主组的ID,即用户的GID;
   第五列是用户的全名,或者是注释;
   第六列是用户主目录的位置,这个目录通常位于/home目录下, 目录名与用户ID 相同;第七列是用户的默认控制台Shell。
注意,在上面的文件当中,所有用户的Password列是一个“x”,但这并不是说用户的密码是x 。这是因为早期的Unix系统密码是以一个强度比较弱的加密手段将密码加密后, 以文本的形式存储在这个文件中。现在已经很少有人再这样做了。Linux系统采取的解决的方法是,在/etc/passwd文件中存放密码的位置只是存放一个“x”,而经过加密的密码存放于/etc/shadow文件中。这项技术通过将用户信息与密码数据分离而提高了安全性。并且采用了强度更高的加密算法来保存密码。一个映像密码条目的样例如下所示:
# cat /etc/shadow
at:!:15200:0:99999:7:::
bin:*:15200::::::
cyrus:!:15200:0:99999:7:::
daemon:*:15200::::::
dhcpd:!:15200:0:99999:7:::
ftp:*:15200::::::
.......
news:*:15200::::::
nobody:*:15200::::::
ntp:!:15200:0:99999:7:::
postfix:!:15200:0:99999:7:::
root:$2a$05$KXPwlTHjhgw4w0nY07zHx.6RlOpdmudzlRh6LfUp2tvjwyGglHP5y:15200::::::
sshd:!:15200:0:99999:7:::
 
2./etc/shadow 文件
/etc/shadow的格式与/etc/passwd类似,由若干个字段组成,字段之间用“:” 隔开,这些字段格式如下:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间;不活动时间:失效时间:标志每个字段含义如下:
◆登录名是与/etc/passwd文件中的登录名相一致的用户账号。
◆ 口令字段存放的是加密后的用户口令字。如果为空,则对应用户没有口令,登录时不需要口令;
◆ 最后一次修改时间表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。
◆ 最小时间间隔指的是两次修改口令之间所需的最小天数。
◆ 最大时间间隔指的是口令保持有效的最大天数。
◆警告时间字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
◆ 不活动时间表示的是用户没有登录活动但账号仍能保持有效的最大天数。
◆ 失效时间字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。
3.系统审计
Linux的日志文件用来记录整个操作系统使用状况,他们是黑客攻击的重点目标,所以作为一个Linux网络系统管理员要充分用好以下几个日志文件。
◆ /var/log/lastlog文件
记录最后进入系统的用户信息,包括登录的时间、登录是否成功等信息。这样用户登录后只要用lastlog命令查看一下/var/log/lastlog文件中记录的所用账号的最后登录时间,再与自己的用机记录对比一下就可以发现该账号是否被黑客盗用。
可以用以下命令查看其空间占用情况
#du -h /var/log/lastlog
有时候需要清空,使用以下命令
#cat /dev/null >; /var/log/lastlog
◆ /var/log/secure文件
记录系统自开通以来所有用户的登录时间和地点,可以给系统管理员提供更多的参考。
◆ /var/log/wtmp文件
记录当前和历史上登录到系统的用户的登录时间、地点和注销时间等信息。用last命令可以查看,若想清除系统登录信息,只需删除这个文件,系统会生成新的登录信息。
用以下命令查看
#last -f /var/log/wtmp
以上几个文件都是由系统的klogd和syslogd守护进程进程记录的。通常klogd用来记录系统内核所产生的日志信息,也就是工作在系统内核态的进程所产生的日子记录; 而syslogd用来记录工作在用户态的进程的日志信息,这些程序包括用户进程、网络服务器进程和多数的系统守护进程。因此,对于管理人员而言,通过及时检查syslogd记录的信息能够发现绝大多数的系统异常情况。
    下面介绍一下syslogd进程的记录格式和配置方法。syslogd负责发送、记录系统内核及工具所产生的信息。整个机制由系统调用syslog()、系统守护进程syslogd,以及配置文件/etc/syslog.conf共同组成。当系统内核及工具产生信息时,通过调用syslog(),把信息送往syslogd,它再根据/etc/syslog.conf中的配置要求,、将这些信息分别做如下处理:
        记录到系统日志中;
        输出到系统控制台上;
        转发给指定的用户;
        通过网络转发给其它主机上的syslogd。
通过配置syslog.conf,可以灵活地对信息的发送和保存进行控制。
sys1ogd进程在系统启动时由/etc/rc.d/rc2.d/S12syslog
启动。如果需要手工启动或停止syslogd,可以使用下面命令:
# /etc/rc.d/init.d/syslog start | stop
# cat /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                            /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                          /var/log/secure
# Log all the mail messages in one place.
mail.*                                             /var/log/maillog
# Log cron stuff
cron.*                                             /var/log/cron
# Everybody gets emergency messages
*.emerg                                                 *
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
 
/etc/syslog.conf文件中的一项配置记录由“选项”(Selector)和“动作”(Action)两个部分组成,两者间用Tab制表符进行分隔。而“选项” 又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段问用分号分隔。
保留字段中的“类型” 代表信息产生的源头,可以是如下字段:
kern   由Kernel产生的信息。
user   由用户进程产生的信息,对那些由程序或不在此列出的工具产生的信息,其缺省类型都是“user”。
mail  邮件系统产生的信息。
daemon 系统守护进程的信息,如in.ftpd、telnetd。
auth  由login、su、getty等进行身份认证时产生的信息
syslog 由syslogd内部产生的信息。
lpr   行打印spooling系统的信息。
news USENET网络新闻系统的信息。
uucp UUCP系统信息。
cron 和at工具信息。
local  0-7 保留为local使用。
mark syslogd 内部产生的时间戳信息。
   为通配符,表示除mark之外的所有其它类型(此符号不可用以代表所有级别)。
保留字段中的“级别” 代表信息的重要性,可以是下面字段:
emerg 紧急,处于Panic状态,通常应广播到所有用户。
alert  告警,当前状态必须立即进行纠正,例如系统数据库崩溃。
crit   关键状态的警告。
err   表示其它错误。
warning 警告。
notice 非错误状态的报告,但应特别处理。
info  通报信息。
debug 调试程序时的信息。
none 通常调试程序时用,指示带有none级别的类型产生的信息无需送出,例如“*.debug;mail.none”表示调试时除邮件信
息外其它信息都送出。
 “动作”域指示信息发送的目的地,可以是如下参数:
/filename 日志文件,由绝对路径指出的文件名,此文件必须事先建立。
@host 远程主机。
userl,user2 指定用户,如果指定用户已登录,那么他们将收到信息。
*   表示所有用户, 已登录的用户都将收到信息。
下面来看一看Linux下的一个实例/etc/syslog.conf文件:
..............
*.err;kern.debug;daemon.notece;mail.crit /var/adm/messages
..............
上面这行中的“action”就是大家关心的/var/adm/messages文件,输出到它的信息源头“selector”为*.err表
示所有的一般错误信息;kern.debug 表示核心产生的调试信息;daemon.notice表示守护进程的注意信息;mail.crit表示邮件系统的关键警告信息。
了解了syslog.conf格式之后,再来看/var/adm/messages中所记录的日志信息:
.....
Nov l4 l 8:59:05 host sshd(pam_unix)[2l9l3]:authentication failure ; logname= uid=0 euid=0
tty=NODEVssh ruser= rhost=202.21.60.5 user=root
Aug 25 1:13:01 host syslogd 1.5.1: restart.
.....
   由上可以看到每行记录都按照日期、时间、主机名、进程名、进程的PID,以及来自该进程的消息中间用空格分割。两条记录分别记录了一次失败的root登录和一次syslogd进程的重起。系统会使用newsyslog定期检查syslog输出的messages 文件和maillog文件,将旧数据压缩保存为备份文件。
4.其它日志
    除了系统登录记录和syslog记录之外,在FreeBsd系统里,使用自己的记录方式。系统每天都会自动检查系统的安全设置, 包括对SetUID、SetGID的执行文件的检查,其结果将输出到/var/log/setuid.today文件中,管理员可以与/var/log/security.yesterday文件对比,寻找系统安全设置的变化。
    在系统启动的时候,就将内核的检测信息输出到屏幕上,这些信息可以帮助用户分析系统中的硬件状态。一般使用dmesg命令来查看最后一次启动时输出的这个检测信息,这些信息被系统保存在/var/log/dmesg文件中。
#cat /var/log/dmesg |more
Linux version 2.6.18-92.el5 (brewbuilder@hs20-bc2-3.build.redhat.com) (gcc version 4.1.2 20071124 (Red Hat 4.1.2-41)) #1 SMP Tue Apr 29 13:16:1
2 EDT 2008
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
 BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
 BIOS-e820: 00000000000dc000 - 00000000000e4000 (reserved)
 BIOS-e820: 00000000000e8000 - 0000000000100000 (reserved)
............................
此外,各种Shell还会记录用户使用的命令历史,使用用户主目录下的文件来记录这些命令历史,通常这个文件的名字为.bash-history或.history (csh)等。
    本文讲主介绍了Linux系统的基本安全机制、Linux系统如何对用户和文件进行访问权限的设置,以及linux的日志系统,这些都是一些基本的系统管理和安全管理的知识,希望读者能结合系统的运维工作,从中受到启发,更好的把工作做好。