1.Linux系统发展历程
Linux发展历史
Linux系统诞生于1991年,由芬兰大学生(linus Torvalds)和后来陆续加入的众多爱好者共同开发完成。
Linux是开源软件,是源代码开放的Linux分支。具备现代一切功能完整的UNIX系统所具备的全部特征。
Linux的发行遵守GNU的通用公共许可证。
关于内核版本
主版本号.次版本号.修订次数
例:5.10.28
官网:www.kernel.org
如果次版本号为偶数,则为稳定版。
2.文件系统
二级目录
/bin
放置的是在单人维护模式下还能被操作的指令。在/bin底下的指令可以被root与一般账号所使用。
/boot
这个目录主要在放置开机会用到的文件,包括Linux核心文件以及开机选单与开机所需配置文件等。
/dev。
在Linux系统上,任何装置与接口设备都是以文件的形态存在这个目录当中的。
/etc
系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件,各种服务的启始档等。
/home
这是系统默认的用户家目录(home directory)。
/lib
放置的是在开机时会使用的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库。
/media
底下放置的是可移除的装置,包括软盘、光盘、DVD等等装置都暂时挂载于此。
/opt
给第三方安装软件放置的目录。
/root
系统管理员(root)的家目录。
/sbin
放在/sbin底下的为开机过程中所需要的,里面除了开机、修复、还原系统所需要的命令。
/srv
可以视为[service]的缩写,是一些网络服务启动之后,这些服务所需要用的数据目录。
/tmp
这是让一般使用者或者是正在执行的程序暂时放置文件的地方。
三级目录
/usr/lib
包含各应用软件的函式库、目标文件(object file),以及不被一般使用者惯用的执行档或脚本(script)。
/usr/local
系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录,这样比较便于管理。
/var/lib
程序本身执行的过程中,需要使用到的数据文件放置的目录。
/var/log
登录文件放置的目录,里面有比较重要的文件如/var/log/messages,/var/log/wtmp(记录登入者的信息)等。
/etc/init.d
所有服务的预设启动script都是放在这里的。
/etc/passwd
账号
/ect/shadow
Shadow文件
Shadow文件中MD5 HASH等算法
实例的密码域:jack:$y$j9T$2fQbQ20e6wjV5be.dKD7.0$LviWdcdMNsYk0c0hxO/afQIlGQ5ldth4WlrmuVJKsb6:18785:0:99999:7:::
密码域由三部分组成:$id$salt$encrypted
其中id值指的是加密算法,salt指的是随机数,encrypted指的是加密密文。
id为1时,采用md5算法加密。
id为5时,采用SHA256算法加密。
id为6时,采用SHA512算法加密。
id为2、2y、y时,采用Blowfish算法加密。
salt为盐值,是某个固定长度的随机字符串,也就是每次修改passwd之后,都是随机生成该字符串,是对密码进行hash的一个干扰值。
encrypted为散列值。
密文的得来是通过cha *crypt(const char *key, const char *salt);
来计算出来的。
3.基本操作
文件与目录管理
绝对路径和相对路径
绝对路径:路径的写法一定由根目录 / 写起。
绝对路径:路径的写法不是由 / 写起,相对路径意指相对于目前工作目录的路径。
目录的基本操作
cd:变换目录
pwd:显示当前目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
ls:文件与目录的检视
基本命令
用户、组与权限管理
用户 UID /etc/passwd /etc/shadow
组 GID /etc/group /etc/gshadow
从命令行中查看权限 ls -l
创建用户 useradd
创建组 groupadd
更改文件所有权 chown
更改组所有权 chgrp
设置权限 chmod
权限赋予 sudo
用户管理
添加用户:useradd
删除用户:userdel -r
锁定用户:passwd -l
用户属性:usermod
当前用户:id
当前登录用户
执行w命令可以确定当前哪些用户已登录系统
输出信息中个列的含义:
USER字段显示当前登录系统的用户名。
TTY字段显示分配给用户会话的终端。ttyX表示在控制台登录,pts/X和ttypX表示网络连接。
FROM字段显示远程登录主机的IP地址。
LOGIN@字段显示登录用户的本地起始时间。
IDLE字段显示最近一个进程运行开始算起的时间长度。
JCPU字段显示在该控制台或网络连接的全部进程所用的时间。
PCPU字段显示WHAT栏中当前进程所使用的处理器时间。
WHAT字段显示用户正在运行的进程。
端口开放情况
netstat -pan 查看当前开放的端口。
lsof -i 显示进程和端口对应关系。
进程信息
使用命令ps -aux查看进程。
服务信息
使用chkconfig --list查看服务启动信息。
各服务的启动脚本存放在/etc/init.d/和/etc/xinetd.d目录下。
4.常规安全配置
重要目录和文件权限
操作目的
合理配置重要目录和文件的权限,增强安全性。
检查方法
使用命令 “ls -l” 查看目录和文件的权限设置情况。
加固方法
对于重要目录,建议执行如下类似操作:
# chmod -R 750 /etc/rc.d/init.d/*
这样只有root可以读、写和执行这个目录下的脚本。
umask值
操作目的
设置默认的umask值,增强安全性。
检查方法
使用命令"umask"查看默认的umask值是否为027。
加固方法
使用命令 “vi /etc/profile” 修改配置文件,添加行"umask 027" , 即新的创建文件属主读写执行权限,同组用户读和执行权限,其他用户无权限,使用命令"umask 027" 应用设置。
Bash历史命令
操作目的
设置Bash保留历史命令的条数。
检查方法
使用命令 "cat /etc/profile|grep HISTSIZE="
和 "cat /etc/profile|grep HISTFILESIZE="
查看保留历史命令的条数。
加固方法
使用命令 "vi /etc/profile"
修改配置文件,修改HISTSIZE=5和HISTFILESIZE=5即保留最新执行的5条命令。
登录超时
操作目的
设置系统登录后,连接超时时间,增强安全性。
检查方法
使用命令 “cat /etc/profile |grep TMOUT” 查看TMOUT是否被设置。
加固方法
使用命令 “vi /etc/profile” 修改配置文件,添加 “TMOUT=” 行开头的注释,设置为 “TMOUT=180” ,即超时时间为3分钟。
root路径
操作目的
检查系统root用户环境变量path设置中是否包含"."。
检查方法
root用户环境变量path中不应包含当前目录"."
以root身份执行如下命令:
# echo $PATH #会有如下路径:
/usr/loacl/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:
加固方法
使用命令 "vi /etc/profile"
,修改echo $PATH后面的路径。
5.账户安全
禁用无用账号
操作目的
减少系统无用账号,降低风险。
检查方法
使用命令 "cat /etc/passwd"
查看口令文件,与系统管理员确认不必要的账号。
FTP等服务的账号,如果不需要登录系统,shell应该在/sbin/nologin目录下。
加固方法
使用命令 "passwd -l <用户名>"
锁定不必要的账号。
账号策略
操作目的
防止口令暴力破解,降低风险。
检查方法
使用命令 "cat /etc/pam.d/system-auth"
查看配置文件。
加固方法
设置连续输错10次密码,账号锁定5分钟,使用命令 "vi /etc/pam.d/system-auth"
修改配置文件,添加auth required pam_tally.so onerr=fail deny=10 unlock_time=300
检查特殊账号
操作目的
查看空口令和root权限的账号。
检查方法
使用命令 “awk -F:’($2==”")’ /etc/shadow" 查看空口令账号。
使用命令 “awk -F:’($3==0)’ /etc/passwd” 查看UID为零的账号。
加固方法
使用命令 “passwd <用户名>” 为空口令账号设定密码。
UID为零的账号应该只有root,设置UID方法:
usermod -u UID <用户名>
口令周期策略
操作目的
加强口令复杂度等,降低被猜解的可能性。
检查方法
使用命令 “cat /etc/login.defs|grep PASS” 和 “cat /etc/pam.d/system-auth” 查看密码策略设置。
加固方法
使用命令 “vi /etc/login.defs” 修改配置文件。
PASS_MAX_DAYS 90 #新建用户的密码最长使用天数
PASS_MIN_DAYS 0 #新建用户的密码最短使用天数
PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数
使用chage命令修改用户设置,例如:
chage -m 0 -M -E 2000-01-01 -W7 <用户名>
表示:将此用户的密码最长使用天数设为30,最短使用天数设为0,账号2000年1月1日过期,过期前7天里警告用户。
口令复杂度策略
操作目的
加强口令的复杂度等,降低被猜解的可能性。
检查方法
使用命令 “cat /etc/pam.d/system-auth |grep pam_cracklib.so” 查看密码复杂度策略设置。
加固方法
建议在/etc/pam.d/system-auth 文件中配置:
password require pam_cracklib.so difok=3 minlen=8 unredit=-1 lcredit=-1 dcredit=-1
至少8位,包含以为大写字母,一位小写字母和一位数字。
限制root远程登录
操作目的
限制root远程Telnet登录。
检查方法
使用命令 “cat /etc/securetty |grep CONSOLE” 查看是否禁止root远程登录。
加固方法
vi编辑/etc/securetty文件,配置:CONCOLE = /dev/tty01
限制用户su
操作目的
检查是否使用PAM认证模块禁止wheel组之外的用户su为root。
检查方法
使用命令 “cat /etc/pam.d/su |grep pam_wheel.so” 查看配置文件,确认是否有相关限制。
加固方法
编辑su文件(vi /etc/pam.d/su),在开头添加下面两行:
auth sufficient pam_rootok.so
auth required pam_wheel.so group=wheel
这表明只有wheel组的成员可以使用su命令成为root用户。
也可以将用户添加到wheel组,以使它可以使用su命令成为root用户,命令如下:
usermod -G wheel username
检查Grub/Lilo密码
操作目的
查看系统引导管理器是否设置密码。
检查方法
使用命令 “cat /etc/grub.conf |grep password” 查看grub是否设置密码。
使用命令 “cat /etc/lilo.conf |grep passwd” 查看lilo是否设置密码。
加固方法
vi 编辑/etc/grub.conf
splashimage这个参数下一行添加:password 密码。
如果需要md5加密,可以添加一行:password --md5 密码。
vi编辑/etc/lilo.conf
password=密码
SNMP团体字
操作目的
如果打开了SNMP协议,snmp团体字设置不能使用默认的团体字。
检查方法
查看配置文件 cat /etc/snmp/snmpd.conf
加固方法
vi编辑 /etc/snmp/snmpd.conf文件,应禁止使用public、private默认团体字,使用用户自定义的团体字,例如将以下设置中的public替换为用户自定义的团体字:
com2sec notConfigUser default public
弱口令审计
操作目的
检查系统弱口令
检查方法
john /etc/shadow --single
join /etc/shadow --wordlist=pass.dic
加固方法
使用"passwd 用户名" 命令为用户设置复杂密码。
6.服务进程
系统守护进程(服务)
服务就是运行在网络服务器上监听用户请求的进程。
服务是通过端口号来区分的。
在UNIX/Linux系统中,服务是一般通过inetd进程或启动脚本来启动。
通过inetd来启动的服务可以通过在/etc/inetd.conf文件进行注释来禁用。
通过启动脚本启动的服务可以通过改变脚本名称的方式禁用。
常见的服务及其对应的端口
ftp: 21
ssh: 22
telnet: 23
smtp: 25
ssl: 443
http(www): 80
pop3: 110
检查SSH服务
操作目的
对SSH服务进行安全检查。
检查方法
使用命令 “cat /etc/ssh/sshd_config” 查看配置文件。
加固方法
使用命令 “vi /etc/ssh/sshd_config” 编辑配置文件。
(1)不允许root直接登录
将"PermitRootLogin" 的值设为no
(2)修改SSH使用的协议版本
将"Protocol"的版本改为2
(3)修改允许密码错误次数(默认6次)
将"MaxAuthTries"的值设为3
TCP Wrapper
操作目的
使用TCP Wrapper对libwrap库支持的程序做访问限制。
检查方法
使用命令 “cat /etc/hosts.allow” 和 “cat /etc/hosts.deny” 查看配置。
加固方法
使用命令 “vi /etc/host.allow” 和"vi /etc/hosts.deny" 修改配置。
vi /etc/hosts.allow
编辑模式下,添加: sshd:IP地址
vi /etc/hosts.deny
编辑模式下,添加: sshd:ALL
(该配置仅允许特定IP地址访问SSH)
NFS共享
操作目的
查看NFS共享。
检查方法
使用命令"exportfs" 查看NFS输出的共享目录。
加固方法
使用命令 “vi /etc/exports” 编辑配置文件,删除不必要的共享。
Syslogd认证相关记录
操作目的
查看所有日志记录。
检查方法
cat /etc/rsylog.conf |grep authpriv
查看是否有authpriv.* /var/log/secure
加固方法
添加相关日志的记录:
将authpriv设备的任何级别的信息记录到/var/log/secure文件中。
Syslogd日志设置
操作目的
查看所有日志记录。
检查方法
使用命令 “cat /etc/rsyslog.conf” 查看rsyslogd的配置。
系统日志 (默认)在/var/log/messages
cron日志 (默认)在/var/log/cron
安全日志 (默认)在/var/log/secure
加固方法
添加相关日志的记录
限制Ctrl+Alt+Del命令
操作目的
防止误使用Ctrl+Alt+Del重启系统。
检查方法
使用命令"cat /etc/ininttab |grep ctrlaltdel" 查看输入行知否被注释。
加固方法
先vi编辑/etc/inittab配置文件,在行开头用#注释掉。
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
再使用命令 “init q” 应用设置
服务/进程安全
关闭不必要的服务:
1.使用命令 "who -r"查看当前init级别。
2.使用命令 "chkconfig --list <服务器名>"查看所有服务的状态。
3.使用命令 "chkconfig --level <init级别> <服务名> on|off|reset"设置服务在哪个init级别下开机是否启动。
7.网络配置安全
检查网络参数
操作目的
Linux中提供了sysctl命令,可调整网络参数。
检查方法
使用命令 “sysctl -a” 查看当前网络参数。
加固方法
使用命令"vi /etc/sysctl.conf" 修改配置文件,有选择的添加以下内容:
net.ipv4.icmp_echo_ignore_broadcasts = 1 #忽略ICMP广播
net.ipv4.icmp_echo_ignore_all = 1 #忽略ICMP echo请求
net.ipv4.ip_default_ttl = 128 #修改TTL为128
使用命令"sysctl -p" 使更改生效
自定义规则
iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。
命令输入顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
参数选项
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-L:显示规则链中已有的条目;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-O<网络接口>:指定数据包要离开本机所使用的网络接口。
规则链名包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
动作包括:
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
限制进入连接
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -M state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
限制外发连接
iptables -A OUTPUT -o eth0 -p tcp --syn -j DROP
iptables -A OUTPUT -o eth0 -p udp -j DROP
iptables -list查看规则
8.日志审计安全
日志审计
配置rsyslog.conf,启用安全事件日志记录。
编辑/etc/rsyslog.conf
配置:*.err;kern.debug;daemon.notice /var/adm/messages
其中/var/adm/messages为日志文件。
la /var/log
系统日志分析
message日志:
messages日志位置为/var/log/messages。
messages中记录有运行信息和认证信息,对于追查恶意用户的登录行为有很大帮助。
cron日志:
cron日志位置为/var/log/cron。
记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。
secure日志:
ssh登录日志会存储于/var/log/secure中,若日志中出现大量的登录错误信息,则可能意味着远程主机在尝试破解ssh登录口令。
last日志:
last命令用于查看最近用户登录情况,last命令读取wtmp内容。
lastlog命令,用于查看系统内所有账户最后一次登录信息,该命令读取/var/log/lastlog内容。
9.安全工具
分析工具
grep命令的使用
查找一句话木马(<?php eval($_post[cmd]);?>)
假设网站的目录为/app/website/,我们需要查看目录下是否有一句话木马文件:
方法1:
grep -i -r eval\(\$_post /app/website/*
其中-i表示不区分大小写,-r表示递归操作。
方法2:
find /app/website/ -type f|xargs grep eval\(\$_post
xargs 将find搜索出的文件名称变成grep后面需要的参数。
弱口令审计工具
john
john /etc/shadow --single
john /etc/shadow --wordlist=pass.dic
Hydra
hydra -l login -P /tmp/passlist 192.168.100.10 ftp
login为要破解的用户名,passlist为密码字典库。
hydra -l login -P passfile 192.168.100.10 smb
login为要破解的登录名,passfile为密码字典库。
后门程序检测工具
chkrootkit
用于UNIX/Linux的本地rootkit检查工具。
检测命令:./chkrootkit -q -r /
Rootkit Hunter
检测命令:rkhunter -check