/主层次的根,也是整个文件系统层次结构的根目录
/bin存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat、ls、cp等等
/boot存放引导加载程序文件,例如kernels、initrd等
/dev存放必要的设备文件,例如/dev/null
/etc存放主机特定的系统级配置文件。其实这里有个关于它名字本身意义上的的争议。在贝尔实验室的UNIX实施文档的早期版本中,/etc表示是“其他(etcetera)目录”,因为从历史上看,这个目录是存放各种不属于其他目录的文件(然而,文件系统目录标准 FSH 限定 /etc 用于存放静态配置文件,这里不该存有二进制文件)。早期文档出版后,这个目录名又重新定义成不同的形式。近期的解释中包含着诸如“可编辑文本配置”或者“额外的工具箱”这样的重定义
/etc/opt存储着新增包的配置文件 /opt/.
/etc/sgml存放配置文件,比如 catalogs,用于那些处理SGML(译者注:标准通用标记语言)的软件的配置文件
/etc/X11X Window 系统11版本的的配置文件
/etc/xml配置文件,比如catalogs,用于那些处理XML(译者注:可扩展标记语言)的软件的配置文件
/home用户的主目录,包括保存的文件,个人配置,等等
/lib/bin/ 和 /sbin/中的二进制文件的必需的库文件
/lib<架构位数>备用格式的必要的库文件。 这样的目录是可选的,但如果他们存在的话肯定是有需要用到它们的程序
/media可移动的多媒体(如CD-ROMs)的挂载点。(出现于 FHS-2.3)
/mnt临时挂载的文件系统/opt可选的应用程序软件包
/proc以文件形式提供进程以及内核信息的虚拟文件系统,在Linux中,对应进程文件系统(procfs )的挂载点
/root根用户的主目录
/sbin必要的系统级二进制文件,比如, init, ip, mount
/srv系统提供的站点特定数据
/tmp临时文件 (另见 /var/tmp). 通常在系统重启后删除
/usr二级层级存储用户的只读数据; 包含(多)用户主要的公共文件以及应用程序
/usr/bin非必要的命令二进制文件 (在单用户模式中不需要用到的);用于所有用户
/usr/include标准的包含文件
/usr/lib库文件,用于/usr/bin/ 和 /usr/sbin/中的二进制文件
/usr/lib<架构位数>备用格式库(可选的)
/usr/local三级层次用于本地数据,具体到该主机上的。通常会有下一个子目录,比如, bin/, lib/, share/.
/usr/local/sbin非必要系统的二进制文件,比如用于不同网络服务的守护进程
/usr/share架构无关的 (共享) 数据.
/usr/src源代码,比如内核源文件以及与它相关的头文件
/usr/X11R6X Window系统,版本号:11,发行版本:6
/var各式各样的(Variable)文件,一些随着系统常规操作而持续改变的文件就放在这里,比如日志文件,脱机文件,还有临时的电子邮件文件
/var/cache应用程序缓存数据. 这些数据是由耗时的I/O(输入/输出)的或者是运算本地生成的结果。这些应用程序是可以重新生成或者恢复数据的。当没有数据丢失的时候,可以删除缓存文件
/var/lib状态信息。这些信息随着程序的运行而不停地改变,比如,数据库,软件包系统的元数据等等
/var/lock锁文件。这些文件用于跟踪正在使用的资源
/var/log日志文件。包含各种日志。
/var/mail内含用户邮箱的相关文件
/var/opt来自附加包的各种数据都会存储在/var/opt/.
/var/run存放当前系统上次启动以来的相关信息,例如当前登入的用户以及当前运行的daemons(守护进程).
/var/spool该spool主要用于存放将要被处理的任务,比如打印队列以及邮件外发队列
/var/mail过时的位置,用于放置用户邮箱文件
/var/tmp存放重启后保留的临时文件
## 系统内账户相关重要目录
test:x:501:501:test user:/user:/home/test:/bin/bash 内容分别为
用户名:密码:UID:GID:用户全名:用户主目录:用户shell
/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。
前面介绍了 /etc/passwd 文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从
/etc/passwd 文件中分离出来,并单独放到了此文件中。/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
注意,如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。介绍此文件之前,我们先打开看看,执行如下命令: [root@localhost ~]#vim /etc/shadow root:
$6$9w5Td6lg
$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoom ff9isV1
PzdcXmixzhnMVhMxbvO:15775:0:99999:7::: bin::15513:0:99999:7:::
daemon::15513:0:99999:7::: …省略部分输出…同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9
个字段。每个字段的含义如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段接下来,给大家分别介绍这 9 个字段。 用户名 同 /etc/passwd 文件的用户名有相同的含义。 加密密码
这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES
加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 “!”、“*”
或 “x” 使密码暂时失效。所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是
“!!”,代表这个用户没有密码,不能登录。 最后一次修改时间 此字段表示最后一次修改密码的时间,可是,为什么 root 用户显示的是
15775 呢?这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为
366 天。这里显示 15775 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 15775 天修改的 root
用户密码。那么,到底 15775 代表的是哪一天呢?可以使用如下命令进行换算: [root@localhost ~]# date -d
“1970-01-01 15775 days” 2013年03月11日 星期一 00:00:00 CST可以看到,通过以上命令,即可将其换算为我们习惯的系统日期。 最小修改时间间隔 最小修改间隔时间,也就是说,该字段规定了从第 3
字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10
天之内不能再次修改密码。此字段是为了针对某些人频繁更改账户密码而设计的。 密码有效期 经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3
字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。 该字段的默认值为 99999,也就是 273
年,可认为是永久生效。如果改为 90,则表示密码被修改 90
天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。 密码需要变更前的警告天数 与第 5
字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是
-1,则代表密码永远不会失效。 账号失效时间 同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!该字段通常被使用在具有收费服务的系统中。 保留 这个字段目前没有使用,等待新功能的加入。 忘记密码怎么办
经常有读者会忘记自己的账户密码,该怎么处理呢?对于普通账户的密码遗失,可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root 的身份使用
passwd 命令即可)。如果 root 账号的密码遗失,则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd
命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root
无法密码即可登陆,建议登陆后使用 passwd 命令配置 root 密码。
基本命令
用户、组与权限管理
用户 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
端口开放情况
netstat -pan 命令查看当前开放的端口
lsof -i 显示进程和端口对应的关系
进程信息
使用命令ps -aux查看进程
服务信息
用chkconfig --list查看服务启动信息
各服务的启动脚本存放在/etc/init.d/和/etc/xinetd.d目录下
重要目录和文件权限
操作目的
合理配置重要目录和文件的权限,增强安全性
检测方法
使用命令“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”,即超时时间为三分钟
root路径
操作目的
检查系统root用户变量path设置中是否包含“.”
检查方法
root用户环境变量path中不应包含当前目录“.”
以root身份执行如下命令:
echo $PATH /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:.
加固方法
使用命令“vi /etc/profile”修改配置文件,修改echo $PATH后面的路径
## 账户安全
禁用无用账户
操作目的
减少系统无用账号,降低风险
检查方法
使用命令“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==“”)’ /etc/shadow”查看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 30 -E 2000-01-01 -W 7 <用户名>
表示:将此用户的密码最长使用天数设为30,最短使用天数设置为0账号2000年1月1日过期,过期前7天内警告用户
口令复杂度策略
操作目的
加强口令的复杂度,降低被猜解的可能
检查方法
使用命令“cat /etc/pam.d/system-auth | grep pam_cracklib.so”查看密码复杂度策略设置
加固方法
建议在/etc/pam.d/system-auth文件中配置:
password requisite pam_cracklib.so difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 至少8位,包含一位大写字母,一位小写字母和一位数字
限制root远程登录
操作目的
限制root远程telnet登录
检查方法
使用命令“cat /etc/securetty |grep CONSOLE”查看是否禁止root远程登录
加固方法
vi编辑/etc/securetty文件,配置:CONSOLE=/dev/tty01
限制用户su
操作目的
检查是否使用PAM认证模块禁止wheel组之外的用户su位root
检查方法
使用命令“cat /etc/pam.d/su|grep pam_wheel.so”查看配置文件,确认是否有相关设置
加固方法
vi编辑su文件(vi /etc/pam.d/auth sufficient pam_rootc auth)
检查Grub/Lilo密码
操作目的
查看系统引导管理器是否设置密码
检查方法
使用命令“cat /etc/grub.config |grep password”查看grub是否设置密码
使用命令“cat /etc/lilo.config |grep password”查看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/snmp.conf文件
应尽早使用public、private默认团体字,使用用户自定义的团体字,例如将一下设置中的public替换为用户自定义的团体字:com2sec notConfigUser default public
弱口令审计
操作目的
检查系统弱口令
检查方法
john /etc/shadow --single
john /etc/shadow --wordlist=pass.dic
加固方法
使用password 用户名 命令为用户设置复杂的密码
系统守护进程(服务)
服务就是运行在网络服务器上监听用户请求的进程
服务器是通过端口号来区分
常见的服务及其对应的端口
FTP:21
SSH:22
SMTP:25
SSL:443
HTTP:80
POP3:110
LINUX系统的服务/进程
系统守护进程(服务)
在unix/Linux系统中,服务是一般通过inetd进程或启动脚本来启动
通过inetd来启动的服务可以通过在/etc/inetd.conf文件进行注释来禁用
通过启动脚本启动的服务可以通过改变脚本名称的方式禁用
检查SSH服务
操作目的
对SSH服务进行安全检查
检查方法
使用命令“cat /etc/ssh/sshd_config”查看配置文件
加固方法
vi编辑/etc/ssh/sshd_config文件,
不允许root直接登录:设置“PermitRootLogin”的值为no
修改SSH使用的协议版本:设置“Protocol”的版本为2
修改允许密码错误次数(默认6次):设置“MaxAuthTries”的值为3
TCP Wrapper
操作目的
使用TCP Wrapper对libwrap库支持的程序做访问控制
检查方法
使用命令“cat /etc/hosts.allow”和“cat /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/rsyslog.conf |grep authpriv
查看是否有authpriv.* /var/log/secure
加固方法
添加相关日志的记录:
将authpirv设备的任何级别的信息记录到/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/inittab|grep ctrlaltdel”查看输入行是否被注释
加固方法
vi编辑/etc/inittab文件,编辑配置文件,在行开头添加注释符号“#”
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now,再使用命令“init q”应用设置
服务/进程安全
关闭不必要的服务:
使用命令“who -r”查看当前init级别
使用命令“chkconfig --list<服务名>”查看所有服务的状态
使用命令“chkconfig --level
检查网络参数
操作目的
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项目的一部分
iptable -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<网络接口>:指定数据包要离开本机所使用的网络接口
规则链名包括:
INPOUT链:处理输入处理包
OUTPUT链:处理输出数据包
PORWARD链:处理转发数据包
动作包括:
accept:接收数据包
DROP:丢弃数据包
REDIRECT:重定向、映射、透明代理
限制进入连接
iptables -A INPUT -i eth0 -s 192.168.10.0/24 -p tcp --dport 22 -j
限制外发连接
iptables -A OUTPUT -o eth0 -p tcp --syn -j DROP
iptables -list 查看规则链
配置rsyslog。conf,启用安全事件日志记录
配置/etc/rsyslog.conf
配置:*.err;kern.debug;daemon.notice /var/adm/messages
其中/var/adm/messages为日志文件
ls /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
分析工具
grep命令的使用
查找一句话木马()
假设网站的目录为/app/website/,我们需要查看该目录下是否包含该形式的一句话文件:
方法一:
$grep -i -r eval($_post /app/website)
其中-i表示不区分大小写,-r表示搜索指定目录及其子目录
方法二:
f i n d / a p p / w e b s i t e / − t y p e f ∣ x a r g s g r e p e v a l ( find /app/website/ -type f|xargs grep eval( find/app/website/−typef∣xargsgrepeval(_post)
xargs 将find搜索出来的文件名称变成grep后面需要的参数
弱口令审计
John the ripper
john /etc/shadow --single
john /etc/shadow --wordlist=pass.dic
hydra
hydra -l login -P /tmp/passlist 192.168.0.1 ftp
login为要破解的用户名,passlist为密码字典库
hydra -l login -P passfile 192.168.0.1 smb
login为要破解的登录名,passfile为密码字典库
后门程序检测
chkrookit
用于UNIX/Linux的本地rootkit检查工具
http://www.chkrootkit.org/
rootkit hunter
http://rkhunter.sourceforge.net/
检测命令:rkhunter-check