看操作系统版本:
debian:/etc/debian_version
redhat:/etc/redhat-release
ubuntu:lsb_release -a
获得内核版本:
uname -a
显示时区信息:
cat /etc/timezone
显示服务器是否开启了ntp:
ps -edf | grep ntp
看能否连接到ntp服务器:
ntpq -p -n
看系统都安装了哪些安装包:
dpkg -l | less
看系统dns配置:
cat /etc/resolv.conf
cat /etc/hosts
服务器的防火墙策略:
对往外发包,服务器应该尽量少,推荐几个:响应报文、ntp
服务器文件系统:
文件/etc/fstab包含了静态文件系统信息,定义了存储设备和分区整合到整个系统的方式。mount
命令会读取这个文件,确定设备和分区的挂载选项。
服务器的文件系统,要确保以下以下选项不要设置:
noatime(不更新文件系统上 inode 访问记录,可以提升性能,与noatime相对应的是atime,Linux 在默认情况下使用atime
选项,每次在磁盘上读取(或写入)数据时都会产生一个记录。这是为服务器设计的,在桌面使用中意义不大。默认的 atime
选项最大的问题在于即使从页面缓存读取文件(从内存而不是磁盘读取),也会产生磁盘写操作)
/tmp或者/home文件系统,要设置noexec和nosuid,防止执行二进制文件和提升权限,如果/dev使用devfs,那么建议/dev也设置nosuid
敏感文件:
服务器要确保含有敏感信息(如密码或者私有key)的文件不能被任何用户读取和修改
例如:/etc/shadow(包含hash后的用户密码),/etc/mysql/my.cnf(debian-sys-maint密码,这个用户具有root权限,可任意操作mysql数据库,只有debian或者ubuntu操作系统会有这个用户),被apache使用的ssl私有key
并且要确保这些敏感文件的backup文件不能被读取,例如:/etc/shadow.backup
setuid文件:
setuid文件在执行的时候,会具有文件所有者的权限,例如/usr/bin/passwd文件就具有setuid属性,普通用户修改自己的密码的时候,会修改/etc/shadow文件,在执行命令passwd的时候,就会执行/usr/bin/passwd文件,具有/etc/bin/passwd所有者(root)权限,修改/etc/shadow文件
如果setuid文件没有正确设置,对安全性会有极大的破坏,因此在配置web服务器的时候,要确保哪些必要的文件设置成setuid权限,并且这些设置了setuid权限的文件,是否有正确的权限被执行
普通文件:
要注意设置普通用户的权限
backup文件:
要注意设置backup文件的权限,如果它被任意用户读取,如果含有敏感信息,那么就会泄露
用户权限控制:
检查/etc/passwd文件:
检查/etc/passwd文件主要是检查各个用户的shell是否合理,通过限制各个用户的shell,能够避免命令执行或者远程使用错误的用户连接
/etc/passwd文件各个字段含义建如下地址:http://blog.csdn.net/snlying/article/details/6130468
检查/etc/shadow文件:
检查/etc/shadow文件主要是检查密码加密算法,加密算法特点如下,
des:没有$
md5:$1$开头
blowfish:$2$或者$2a$开头
sha-256:$5$开头
sha-512:$6$开头
这些加密文件信息,可以使用john来进行解密,关于john的使用,我会单独介绍
检查/etc/sudoers文件:
没有正确配置/etc/sudoers文件,会导致一些用户提升到root权限,危害到服务器的安全
例如,一个用户可以使用chown和chmod命令,它拷贝一个shell到自己的目录,然后给它加上执行权限和增加setuid权限,然后chown这个文件为root,这是这个shell就有root权限了
服务检查:
ps命令
下面重点介绍能够显示服务器侦听服务命令lsof
lsof -i UDP -n -P 显示udp服务
lsof -i TCP -n -P 显示tcp服务
openssh检查:
linux服务器的ssh配置在/etc/ssh_config
检查如下几项:PermitRootLogin最好设置成no,通过设置protocol 2 disable版本1,最好更改ssh的端口,AllowTcpForwarding设置成no
mysql数据库检查:
mysql数据库配置文件的位置为/etc/mysql/my.cnf
[mysqld]
bind-address = 127.0.0.1
通过这个设置,只允许本地访问数据库,进制其它地址访问
服务器root用户可以使用如下命令,查看mysql数据库的用户hash
strings /var/lib/mysql/mysql/user.MYD
debian-sys-maint(可以dump数据库信息) 用户的密码也存放在/etc/mysql/debian.cnf文件
登录数据库之后,第一件事情是看数据库的版本,然后可以根据版本找漏洞
然后找数据库的用户名和密码,但是密码是加密的
mysql用户密码新加密算法密码类似如下:*4ACFE3202A5FF5CF467898FC58AAB1D61502944,旧加密算法密码类似如下:43e9a4ab75570f5b
因此查找到加密密码后需要使用john解密,但是john解密的文件格式要对,格式如下:
wordpress:*C260A4F79FA905AF65142FFE0B9A14FE0E1519CC
然后使用john的mysql-sha1命令解密
另外,需要看哪些用户有写文件的权限(可以生成webshell),可使用如下语句查询:
SELECT user,file_priv FROM mysql.user WHERE FILE_PRIV='Y
apache配置:
apache服务器运行的权限,/etc/apache2/envvars
web root下的文件不能是777权限,要限制
apache服务器的信息要尽可能的少泄露,在debian上,需要配置/etc/apache2/conf.d/security文件的如下字段:
ServerTokens: the recommended value is Prod
ServerSignature should be turned Off
进制目录泄露需要修改/etc/apache2/sites-enable/000-default文件:
<Directory /var/www/wordpress/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
配置cat /etc/apache2/mods-enabled/php5.conf 禁止php文件在/~username/目录执行,因为这样会导致从用户权限切换到apache权限,可能导致提升权限的后果
php配置检查:
cat /etc/apache2/mods-enabled/php5.load可以看到那个版本的php被加载,在这里以php5为例
strings /usr/lib/apache2/modules/libphp5.so | grep apache2
/etc/php5/apache2
/etc/php5/apache2/conf.d
通过上面的命令结果和阅读debian文档,可以推测apache2的php配置在/etc/php5/apache2/
expose_php选项打开会导致服务器返回的报文有X-Powered-By字段,应该关闭
display_errors选项需要关闭
error_reporting设置成 E_ALL
log_errors设置成on
safe_mode设置成on
如下函数禁用:eval, exec, passthru, shell_exec, system, proc_open,popen
allow_url_include设置成禁用
crontab检查:
/var/spool/cron/crontabs文件里面有所以的crontab任务,假设/var/spool/cron/crontabs内容如下:
0 2 * * * /root/backup.sh
但是/root/backup.sh的权限是777,那么就很危险了