写在前面:当你部署一台服务器,第一步不应该是部署应用,安全是才是首要任务

如果某一天当你登录服务器发现 /bin/bash –i,python -c 'import pty; pty.spawn("/bin/sh")' 等命令在服务器上出现的时候,那么恭喜你,服务器被入侵了

但是入侵者都是很聪明的,首先会执行以下命令

unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0

然后是通过跳板访问

ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

建立ttyshell

python -c ‘import pty; pty.spawn(“/bin/sh”)’

然后清除访问记录

shred -n 31337 -z -u file_to_delete

等等。。。一系列的操作

然后你就能看到服务器上会留下以上的蛛丝马迹,那么我们如何防止呢?

1、系统用户优化

用户是Linux中安全加固的第一关,如果系统中本身就存在有安全隐患的用户,那么再安全策略也无法起到加固的效果

cat /etc/passwd | awk -F: '$3==0'  //列出具有超级权限的用户
cat /etc/passwd | grep '/bin/bash' //列出具有登录shell的用户

如果除了root还有其他的超级用户,那就要非常小心了

1.1 将系统自带的用户和用户组删除掉

删除的用户,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher

删除的组,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers

1.2 或者锁定不需要登录的用户

如:xfs,news,nscd,dbus,vcsa,games,nobody,avahi,haldaemon,gopher,ftp,mailnull,pcap,mail,shutdown,halt,uucp,operator,sync,adm,lp,bin,sys,nuucp,hpdb,www,daemon

1.3 限制能够su为root的用户

#在 /etc/pam.d/su 头部添加:
auth required /lib/security/pam_wheel.so group=wheel

这样,只有wheel组的用户可以su到root

1.4 检查shadow中空口令帐号

awk -F: '( $2== "") { print }' /etc/shadow

对空口令账号进行锁定,或要求增加密码

1.5 系统关键目录权限控制

根据安全需要,配置某些关键目录其所需的最小权限,password文件、shadow文件、group文件权限。

/etc/passwd 所有用户都可读,root用户可写 –rw-r—r—

chmod 644 /etc/passwd

/etc/shadow 只有root可读 –r——–

chmod 600 /etc/shadow

/etc/group 必须所有用户都可读,root用户可写 –rw-r—r—

chmod 644 /etc/group

2、系统服务优化

一般情况下,系统可能会自动的运行一些不必要的服务,我们可以使用下面的命令查看当前默认开启运行的系统服务:

chkconfig --list | grep "3:on"

如果我们只是提供web服务,那么对于sendmail、nfs、postfix、ftp等不需要的服务就可以关闭了

对于关键的服务,我们需要保证它们的运行,比如:iptables、sshd、syslog、httpd、nginx、mysql、php-fpm等。

3、ssh访问策略

ssh的访问都是我们日常工作中几乎唯一的控制系统的手段。所以ssh的安全性非常重要,一般来说较高的ssh安全策略秉承以下几个原则。

  • 禁止root用户ssh登录。

  • 禁止口令的方式验证。

  • 只允许一个用户拥有sudo的完整权限。

  • 除非是堡垒机,系统中不允许存放私钥文件。

  • 使用一个随机端口来代替22端口。

编辑 /etc/sudoers,加入一条:

test ALL=(ALL)       NOPASSWD: ALL

这里的例子表示:将test赋予完全的sudo权限,并在sudo提权时不需要验证密码。

sed -i 's/\(PasswordAuthentication\) yes/\1 no/' /etc/ssh/sshd_config  //禁止口令,使用证书
sed -i 's/\(PermitRootLogin\) yes/\1 no/' /etc/ssh/sshd_config //禁止root用户ssh登录

现在我们来看ssh的访问效果:

  • 所有用户不能使用密码验证登录。

  • root用户不可直接登录的,即使拥有root密码,唯一获得root的方法是使用test用户提权。

  • test用户只可以使用证书登录。

  • ssh不再使用默认的22端口

4、系统内部安全配置

4.1、保护引导过程

//用户启动需要输入主机密码
echo "sp:S:respawn:/sbin/sulogin" >> /etc/inittab //编辑/etc/init/control-alt-delete.conf,禁用 ctrlaltdel
start on control-alt-delete 更改为 #start on control-alt-delete

4.2、内核修改

/etc/sysctl.conf 改为以下内容

kernel.shmall = 268435456
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.core.somaxconn = 256
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_keepalive_time = 500
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0

/etc/security/limits.conf 改为以下内容

* soft nofile 655360
* hard nofile 655360

解释

net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
#TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
#对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,
#但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死

4.3 密码口令策略修改

cat /etc/login.defs|grep PASS
PASS_MAX_DAYS 90 #新建用户的密码最长使用天数
PASS_MIN_DAYS 0 #新建用户的密码最短使用天数
PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数
PASS_MIN_LEN 9 #最小密码长度9

4.4 历史命令保留和常用服务端口修改

vim /etc/profile
修改HISTSIZE=5和HISTFILESIZE=5即保留最新执行的5条命令
常用服务入SSH,FTP,MYSQL,等,不要使用默认端口

4.5、Banner伪装

可以扰乱入侵者这对服务器信息的判断

a、Vsftpd banner 伪装

修改vsftpd.conf

ftpd_banner=Welcome to Microsoft FTP service.

b、Apache banner 伪装

修改/usr/local/apache/conf/httpd.conf文件,可以隐藏一些apache信息,如果要屏蔽掉所有信息,需要修改源码文件重新编译

httpd-2.2.25/include/ap_release.h
httpd-2.2.25/os/unix/os.h

c、Nginx banner 伪装

在nginx.conf 的 http 块里面添加 server_tokens off;

若要彻底屏蔽,需要修改源码,重新安装

src/core/nginx.h

d、 PHP banner修改
php.ini 修改expose_php On —> expose_php = Off

Php彩蛋,PHP源码/ext/standard/info.h

e、 TTL值修改

echo net.ipv4.ip_default_ttl = 128 >> /etc/sysctl.conf
/sbin/sysctl –p

f、利用iptables,将本机的TCP 3389端口转移到其它开有3389端口的计算机上,给Linux系统伪装出一个提供服务的TCP 3389端口

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to xx.xx.xx.xx
iptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE

4.6、防火墙IPtables设置

下面是linux一些常用的服务所需要的规则。(根据实际情况更改)

vim  /etc/sysconfig/iptables

# Generated by iptables-save v1.3.5 on Thu Oct 31 19:38:46 2013
*filter
:INPUT ACCEPT [782:100478]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [227493:21979253]
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT (可以用后面的防CC的规则替代)
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT –p tcp -j REJECT –reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Thu Oct 31 19:38:46 2013 service iptables save
service iptables restart

(1) iptables 防止CC攻击的规则

安装 kernel-smp-modules-connlimit 、recent 内核模块

modprobe ipt_connlimit
如果没有这个文件需要新建如下文件

# cat /etc/modprobe.d/ipt.conf

options ipt_recent ip_pkt_list_tot=200
modprobe –r ipt_recent

控制单个IP的最大并发连接数

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT #允许单个IP的最大连接数为 30
//控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT #单个IP在60秒内只允许最多新建30个连接

(2)iptables 限制主机登录的规则

//限制每个主机每小时只能连接5次主机(INPUT链默认规则为ACCEPT)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

4.7、防止暴力登录

ftp,ssh暴力登录,脚本实现。

4.8、监控所有终端用户操作

记录所有登录用户终端操作命令记录

vim /etc/profile

PS1="`whoami`@`hostname`:"'[$PWD]'
history
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi if [ ! -d /tmp/csi ]
then
mkdir /tmp/csi
chmod 777 /tmp/csi
fi if [ ! -d /tmp/csi/${LOGNAME} ]
then
mkdir /tmp/csi/${LOGNAME}
chmod 300 /tmp/csi/${LOGNAME}
fi export HISTSIZE=4096
DT=`date "+%Y-%m-%d_%H:%M:%S"`
export HISTFILE="/tmp/csi/${LOGNAME}/${USER_IP} csi.$DT"
chmod 600 /tmp/csi/${LOGNAME}/*csi* 2>/dev/null source /etc/profile

4.9 日志审计

统一远程日志服务器配置,当前系统应配置远程日志功能,将需要重点关注的日志内容传输到日志服务器进行备份。

修改配置文件 /etc/rsyslog.conf

加上这一行:authpriv.* @x.x.x.x

重新启动syslog服务,执行下列命令:services syslogd restart

4.10、更改危险文件(命令)权限

只有root用户能使用一下命令

chmod 700 /bin/ping
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/who
chmod 700 /usr/bin/w
chmod 700 /usr/bin/locate
chmod 700 /usr/bin/whereis
chmod 700 /sbin/ifconfig
chmod 700 /usr/bin/pico
chmod 700 /usr/bin/vi
chmod 700 /usr/bin/which
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/make
chmod 700 /bin/rpm

4.11、杀毒软件

下载 http://www.clamav.net/lang/en/download/sources/

直接下载:http://downloads.sourceforge.net/clamav/clamav-0.98.1.tar.gz

4.12 、rootkit病毒检测

Rkhunter 下载:http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.2/rkhunter-1.4.2.tar.gz

chkrootkit 下载:ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz

4.13、inotify 监控系统文件

监控命令

inotifywait -m -d -o /tmp/inotify.log -r --timefmt "%F %T" --format '%T %w%f%:e' -e close_write,create, modify,attrib /var/www/html

Inotify监控比较大的目录的时候会报错,需要修改/proc/sys/fs/inotify/max_user_watches的值

建议写入sysctl.conf:fs.inotify.max_user_watches=8192000

5、系统应用安全配置

5.1、中间件 安全配置

(1) apache安全配置

//Apache 禁止数据目录执行php等脚本文件
<Directory "/path/directory">
<FilesMatch ".(php|asp|jsp)$">
Deny from all
</FilesMatch>
</Directory> //Apache禁用目录浏览和符号链接追踪
<Directory "/usr/local/apache/htdocs">
Options Indexes FollowSymLinks #禁用这两项
AllowOverrride None
Order allow,deny
Allow from all
</Directory>

(2) nginx安全配置

//Nginx 禁止数据目录执行php等脚本文件(在nginx.conf server段配置)
//单个目录
location ~* ^ /attachments/.*\.(php|php5)$ {
deny all;
} //多个目录
location ~* ^/(image|upload)/.*\.(php|php5)$ {
deny all;
}
//nginx 的限制连接模块limit_zone与limit_req_zone
//limit_zone配置
http{
limit_conn_zone $binary_remote_addr zone=one:10m; #one是zone的名字,10m是会话状态存储空间
server{
limit_zone one 1; #1每秒限制链接1次
}
} //Limit_req_zone配置
http{
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; # rate=1r/s 的意思是每个地址每秒只能请求一次,也就是说根据漏桶原理burst=120 一共有120块令牌,并且每秒钟只新增1块令牌120块令牌发完后 多出来的那些请求就会返回503
server{
limit_req zone=req_one burst=120;
}
}

5.2、php 安全配置

open_basedir = .:/tmp/ #防止php木马跨站,重要!!
disable_funcation=chdir,dir,get_cwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,
file_get_contents,fputs,fwrite,chmod,phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,
proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,
escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,
posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,osix_getgrgid,
posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,
posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,
posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,
posix_ttyname,posix_uname //如果服务器用到了采集,需要启用unlink和fopen, file_get_contents,fputs,fwrite,dir
//后台上传图片用到的函数 mkdir,file,file_get_contents,fputs,fwrite,dir magic_quotes_gpc = Off //打开magic_quotes_gpc来防止SQL注入
magic_quotes_gpc = On //如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ' 转为 \'等,这对防止sql注射有重大作用。所以我们推荐设置为:
register_globals = Off //关闭注册全局变量
safe_mode = on //php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开:
safe_mode_gid = off //用户组安全,当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。
safe_mode_exec_dir = /usr/www
display_errors = Off
error_reporting = E_WARNING & E_ERROR
log_errors = On
error_log = D:/usr/local/apache2/logs/php_error.log //注意:给文件必须允许apache用户的和组具有写的权限

参考文章

http://m.jb51.net/hack/55784.html

https://blog.slogra.com/post-684.html

http://blog.chinaunix.net/uid-25723371-id-4542221.html

Linux系统安全需要注意的一些问题的更多相关文章

  1. 在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...

  2. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

  3. Linux系统中的Device Mapper学习

    在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. ...

  4. 玩转 Linux 系统的方法论

    Linus 说“Just for fun”,而我要说“Just for 折腾”.想知道我是怎样折腾 Linux 的,请看下面这个截图: 从这个截图可以看出,我为了“折腾” Linux 系统,在我的电脑 ...

  5. Linux 系统中发博客必备的五大图片处理神器

    发博客时,总免不了要用图片说话.经过长时间的磨合,在 Linux 桌面系统下有几款图片处理软件我已经用得比较顺手了.这几款软件在 Linux 世界使用广泛,各个 Linux 发行版的软件仓库中都有自带 ...

  6. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  7. 在linux系统中安装VSCode(Visual Studio Code)

    在linux系统中安装VSCode(Visual Studio Code) 1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) 访问Visual Studio Code官网  ...

  8. 如何重置硬盘遭到“损坏”的Linux系统root用户密码

    传统印象下Linux是非常坚不可摧的,具有千年不更新,万年不重启的美名.而随着虚拟化的推进,很多跑在虚拟化上的Linux由于先前基础架构的脆弱,变得适应性“越来越不好”,体现在IP存储如果出现节点故障 ...

  9. Linux 系统中的MySQL数据库默认区分大小写

    今天在开发中遇到这么个问题,将连接的数据库改为服务器上的时候(服务器是Linux系统的),程序跑起来后一直出错,总提示数据库的表找不到, 而打开数据库看该表明明是存在的,在我的印象中MySQL数据是不 ...

  10. 如何配置Linux系统的网络IP地址

    一台安装了Linux系统的电脑如果想要联网,首先要做的就是进行网络配置.今天小编就以CentOS6.4系统为例为大家介绍整个网络配置的过程,虽然只是以CentOS6.4系统为例,但是其它的Linux系 ...

随机推荐

  1. 4)Javascript设计模式:Decorator模式

    function MacBook() { this.cost = function() { return 997; } } var macbook = new MacBook(); function ...

  2. datalog

    https://en.wikipedia.org/wiki/Datalog http://www.csd.uoc.gr/~hy562/1112_spring/instr_material/WhatYo ...

  3. php 禁用eval( )函数

    php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的. 但是eval()对于php安全来说具有很大的杀伤力,因此一般不用的情况下为了防 ...

  4. Thinkphp代码生成工具 ThinkphpHelper

    支持MySQL 和 sqlite数据库,快速构建项目原型,直接生成前后台CRUD代码片段,还可根据需要自行定制代码模板,减少重复劳动. 写这个东西的原因是因为我最近沮丧的发现很多时候我都在做重复的事情 ...

  5. 编写快速、高效的JavaScript代码

    许多Javascript引擎都是为了快速运行大型的JavaScript程序而特别设 计的,例如Google的V8引擎(Chrome浏览器,Node均使用该引擎).在开发过程中,如果你关心你程序的内存和 ...

  6. 用js来实现页面的换肤功能(带cookie记忆)

    用js来实现页面的换肤功能 js实现换肤功能的实现主要是通过利用js控制CSS来实现的.大致的实现原理是这样的, 1.先定义一个页面基本样式style.css来确定div的宽高等属性,使得整个页面的D ...

  7. Unity3D在NGUI中使用mask

    过程是这样的:最近一直想做一个头像的mask效果,后来发现原来unity的mask需要用shader来写,网上找了不少资料,也能实现,不过大多数都是用render texture作为相机投影的text ...

  8. GreenOpenPaint的实现(一)基本框架

    Win7下的MSPaint是Ribbon的典型运行.这种SDI程序对于图像处理来说是很适合的.利用春节时间,基于之前的积累,我实现GreenOpenPaint,主要就是模拟MSPaint的界面,实现出 ...

  9. Android在程序代码中使用String资源

    this.getResources().getString(R.string.name)

  10. ubuntu下编译java程序

    ubuntu下编译java程序 首先需要安装jdk,并配置好相应环境变量 下面以简单的HelloWorld为例 文件名为HelloWorld.java java代码: public class Hel ...