linux web服务器安全概述

 看操作系统版本:

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,那么就很危险了





你可能感兴趣的:(linux web服务器安全概述)