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的日志系统,这些都是一些基本的系统管理和安全管理的知识,希望读者能结合系统的运维工作,从中受到启发,更好的把工作做好。
本文出自 “李晨光原创技术博客” 博客,谢绝转载!
- linux系统安全加固--账号相关
linux系统安全加固 一.账号相关 1.禁用或删除无用账号 减少系统无用账号,降低安全风险. 当我们的系统安装完毕后,系统默认自带了一些虚拟账户,比如bin.adm.lp.games.postfix ...
- linux系统安全加固
版权声明:本文为博主原创文章,支持原创,转载请附上原文出处链接和本声明. 本文地址:https://www.cnblogs.com/wannengachao/p/12068256.html 1.文件上 ...
- CentOS系统安全加固常见方法
关于Linux系统安全加固的具体实现脚本及基线检查规范,以供主机维护人员参考学习. 其中以下脚本主要实现的功能包括: *加固项包括:密码长度.session超时时间.删除不用的帐号和组.限制root用 ...
- Linux主机操作系统加固规范
对于企业来说,安全加固是一门必做的安全措施.主要分为:账号安全.认证授权.协议安全.审计安全.总的来说,就是4A(统一安全管理平台解决方案),账号管理.认证管理.授权管理.审计管理.用漏洞扫描工具 ...
- 如何加固Linux系统
如何加固Linux系统 一. 账户安全 1.1 锁定系统中多余的自建帐号 检查方法: 执行命令 #cat /etc/passwd #cat /etc/shadow 查看账户.口令文件,与系统管理员确认 ...
- Linux 系统的安全加固
Linux是一套免费使用和自由传播的类Unix操作系统,作为一个开放源代码的操作系统,Linux服务器以其安全.高效和稳定的显著优势而得以广泛应用,但如果不做好权限的合理分配,Linux系统的安全性还 ...
- linux系统加固方案
Linux主机操作系统加固规范 目 录 第1章 概述... 1 1.1 目的... 1 1.2 适用范围... 1 1.3 适用版本... 1 1 ...
- Linux系统安全需要注意的一些问题
写在前面:当你部署一台服务器,第一步不应该是部署应用,安全是才是首要任务 如果某一天当你登录服务器发现 /bin/bash –i,python -c 'import pty; pty.spawn(&q ...
- 一致推崇的Linux系统还有那么安全吗?
今天想谈谈关于系统安全:我们都知道,Linux早已成为趋势,在我们互联网中占有不可或缺的地位,在我们眼中,它是神圣的,不可替代的,无懈可击的:真的是这样的吗? 但是关于病毒对Linux所造成的一系列威 ...
随机推荐
- [luogu]P4316 绿豆蛙的归宿(拓扑排序,期望)
P4316 绿豆蛙的归宿 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够 ...
- HTTP——学习笔记(7)
HTTP中的认证机制 什么是认证机制?: 服务器需要知道客户端是谁. 怎样知道客户端身份?: 核对“登录者本人才知道的信息” 密码:只有本人才会知道的字符串信息 动态令牌:仅限本人持有的设备内显示的一 ...
- [Transducer] Make an Into Helper to Remove Boilerplate and Simplify our Transduce API
Our transduce function is powerful but requires a lot of boilerplate. It would be nice if we had a w ...
- Linux磁盘分区(一):加入
***********************************************声明************************************************ 原创 ...
- 2015年开源项目荣登GitHub十强榜单
翻译出自:51CTO.com 开源是一个好东西,2015最振奋人心的就是swift开源. <软件开发时代>杂志(SD Times)回想了GitHub上的一些流行项目,这些项目已给开放和自由 ...
- HDU 5310 Souvenir
Souvenir Accepts: 901 Submissions: 2743 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262 ...
- js中如何取精度
js中如何取精度 一.总结 一句话总结:其实round()函数去经度会有误差,直接用num.toFixed(2)简单方便. toFixed()方法会按照指定的小数返回数值的字符串表示.var num ...
- [学习笔记]HTTP协议
转自:www.cnblogs.com/li0803/archive/2008/11/03/1324746.html Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议,由于 ...
- c# 的类成员
1 字段和变量的区别 字段是在类中定义的数据成员 由访问修饰符+数据类型+字段名(public string name) 字段就像类的一个小数据库,用来存放和类相关的数据; 而变量是没有修饰符的(in ...
- 日常基础—————echo,print,print_r,var_dump的区别
1.echo 函数输出一个或多个字符串. 代码: header("Content-Type:text/html; charset=utf-8"); echo "你好” ...