一个系统有很多功能,易遭攻击点也很多。原则上讲单一功能的系统比多功能的系统更安全。减少可用攻击点,典型的包括卸载不必要的软件,不必要的登录用户名,关闭或移除不必要的服务。其他的还有给kernel打补丁,重编译kernel,关闭打开的网络接口,安装侵入侦察系统,防火墙,入侵预防系统。 第一步,通过服务器的想要功能来决定安装什么服务。例如,如果要搭建web服务器你应该安装Linux, Apache, MySQL, 和 Perl/ PHP/ Python (LAMP)服务,其他的东西都不要安装,因为安装额外的软件或运行额外的服务创造了不必要的易攻击点。 你需要决定你是否需要图形用户界面。Linux管理员可以通过命令行管理网络和服务,但是一些新手管理员倾向于用GUI,GUI占用了大量系统资源,运行不必要的服务。如果要用,在用完之后可以杀掉GUI进程。
一些通用安全优化步骤: 数据加密通讯 避免用不安全的协议发送明文信息或密码 最小化服务器中不必要的软件 关闭不需要的 SUID 和 SGID 的特殊权限 保持系统为最新,尤其是安全补丁 使用安全扩展 考虑用SELinux 提要用户密码复杂度 定期更改密码,避免重复使用同一个密码 当用户登录错误次数太多时,锁定用户 不允许使用空密码 SSH 关闭不必要的服务 提高 /tmp /var/tmp /dev/shm 目录的安全性 隐藏 BIND DNS 服务版本和 apache 版本 提高 sysctl.conf 安全 安装 Root Kit Hunter and ChrootKit Hunter 最小化开放网络端口 配置系统防火墙 更安全合理的分区 关闭不需要的文件权限 维护系统日志,把日志镜像到分离的日志服务器 安装Logwatch并每天查看Logwatch emails 使用侵入侦察系统 安装linux Socket 监控 安装Mod_security 限制用户权限 备份 服务器物理安全
服务器物理安全 配置 BIOS,关闭从CD/DVD和外部设备启动。启用 BIOS 密码和GRUB密码防治在物理上访问你的系统。
保持系统最新 # apt-get update # apt-get upgrade
无人看管的升级 系统自动更新,你需要安装几个软件包,用root运行: # apt-get install unattended-upgrades apt-listchanges unattended-upgrades 软件的默认配置文件是 /etc/apt/apt.conf.d/50unattended-upgrades,默认配置可以很好的工作,但是你可以根据需要做些修改。 vi /etc/apt/apt.conf.d/50unattended-upgrades 设置哪些软件包需要升级: Unattended-Upgrade::Origins-Pattern { // ... }; 取消注释下面这行: Unattended-Upgrade::Mail "root"; 为了激活unattended-upgrades,你需要确认/etc/apt/apt.conf.d/20auto-upgrades 包含如下行: vi /etc/apt/apt.conf.d/20auto-upgrades APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; /etc/apt/apt.conf.d/20auto-upgrades 文件可以手动创建或root执行如下命令: # dpkg-reconfigure -plow unattended-upgrades
最小化服务器中不必要的软件 dpkg --list dpkg --info packageName apt-get remove packageName
su 确保只有在 sudo 组里的用户可以运行su dpkg-statoverride --update --add root sudo 4750 /bin/su
关闭root用户 出于安全原因,可以在不需要root用户操作服务器时将其关闭 passwd -l root //锁定 passwd -u root //解锁
关闭 Shell 用户 查看激活的用户: cat /etc/passwd | egrep -v '/false|/nologin|/shutdown|/halt' | cut -d':' -f 1,7 关闭用户命令: usermod -s /usr/sbin/nologin "username" //注意 没有引号
控制台(console) 在默认下,许多终端都是激活的,如下 vi /etc/securetty
注释掉不需要的终端 tty1 #tty2 #tty3 #tty4 # ...
securetty文件 确保只有root用户可以修改 /etc/securetty 文件 chown root:root /etc/securetty chmod 0600 /etc/securetty
共享内存(Shared memory) 共享内存可以用来攻击运行的服务 如apahce2 vi /etc/fstab 加入行如下 #secure shared memory tmpfs /run/shmtmpfs defaults,noexec,nosuid 0 0 重启生效 mount -a
提高IP安全 在 /etc/sysctl.conf 文件中加入 # Ignore ICMP broadcast requests net.ipv4.icmp_echo_ignore_broadcasts = 1 # Disable source packet routing net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 # Ignore send redirects net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # Block SYN attacks net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 5 # Log Martians net.ipv4.conf.all.log_martians = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 # Ignore ICMP redirects net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 # Ignore Directed pings net.ipv4.icmp_echo_ignore_all = 1
关闭 Open DNS Recursion 和版本信息 终端中执行: vi /etc/bind/named.conf.options 在Options段中加入: recursion no; version "Not Disclosed"; 重启 BIND DNS 服务 /etc/init.d/bind9 restart
关闭IPv6 如果你不需要IPv6,建议关闭 vi /etc/sysctl.conf 增加或修改以下行: #disable ipv6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 重新加载配置 sysctl -p
关闭IPv6 Bind9 监听 vi /etc/default/bind9 增加或修改以下行: # run resolvconf? RESOLVCONF=yes # startup options for the server OPTIONS="-4 -u bind" -
关闭IRQ平衡(Balance) irq balance用于优化中断分配,它会自动收集系统数据以分析使用模式,并依据系统负载状况将工作状态置于 Performance mode 或 Power-save mode。处于Performance mode 时,irqbalance 会将中断尽可能均匀地分发给各个 CPU core,以充分利用 CPU 多核,提升性能。 vi /etc/default/irqbalance 把ENABLED改为0 ENABLED=0
TCP Wrapper TCP Wrapper是基于规则的访问列表,包含以下2个文件 /etc/hosts.allow /etc/hosts.deny 两个文件的语法相似定义如下 daemon : client [:option1:option2:...] 例如,如果你想允许指定IP(或IP范围)而拒绝其他IP通过SSH访问 在 /etc/hosts.allow 文件中加入 sshd : 111.111, 222.222.222.222 在/etc/hosts.deny 文件中加入 sshd : ALL 注意: 每个服务在hosts.allow和hosts.deny只能有一个规则 在hosts.allow和hosts.deny的设置立即生效 在两个文件中的最后一行必须以新的一行结束
/tmp 和 /var/tmp临时存储目录 临时存储目录/tmp, /var/tmp 和 /dev/shm 给攻击者提供了存储空间。
/tmp 给/tmp分区提供一个1G的文件系统 dd if=/dev/zero of=/usr/tmpDSK bs=1024 count=1024000 创建一个当前/tmp的备份 cp -Rpfv /tmp /tmpbackup 挂载/tmp分区并设置正确的访问权限 mount -t tmpfs -o loop,noexec,nosuid,rw /usr/tmpDSK /tmp chmod 1777 /tmp 恢复备份文件 并 删除备份文件: cp -Rpf /tmpbackup/* /tmp/ rm -rf /tmpbackup/* 在fbtab文件中设置/tmp /usr/tmpDSK /tmp tmpfs loop,nosuid,noexec,rw 0 0 检测fbtab mount -o remount /tmp 如果你想在/tmp中执行脚本或可执行文件,你会得到一个permission denied
/var/tmp mv /var/tmp /var/tmpold ln -s /tmp /var/tmp cp -prfv /var/tmpold/* /tmp/
关闭autofs 阻止自动挂载可移动媒体和NFS文件系统,你可以写一条udev规则关闭autofs,首先创建/etc/udev/rules.d/85-no-automount.rules文件 vi /etc/udev/rules.d/85-no-automount.rules 写入 SUBSYSTEM=="usb", ENV{UDISKS_AUTO}="0" 重启服务 service udev restart
设置security limits 设置进程限制防止fork炸弹攻击 vi /etc/security/limits.conf 例子: cyberpunk hard nproc 100 @cybergroup hard nproc 20
关闭不需要的服务 Linux系统安装了很多服务,服务过多将导致资源耗尽。为了提高性能和安全,关闭无用服务。 查看正在运行的服务 initctl list | grep running 你可以移除启动脚本来关闭服务,或者彻底移除它。大部分的服务都可以用下面的命令来关闭。 echo "manual" > /etc/init/service.override update-rc.d -f service_name remove 卸载命令 apt-get purge service_name
关闭anacron anacron子系统设计用来为系统提供cron自动任务功能,这是非常有用的功能,但是如果你没打算用,你可以关闭此服务。 如果你想关闭anacron服务,简单的注释掉 /etc/crontab 文件的以下行 # 25 6* * * roottest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) # 47 6* * 7 roottest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) # 52 61 * * roottest -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
锁定Cronjobs Cron有一个内建功能,可以允许谁可以执行任务,谁不可以。这个功能由两个文件控制/etc/cron.allow 和 /etc/cron.deny。为了禁止一个用户使用cron,在cron.deny加入此用户名。如果想禁止所有用户运行cron,在cron.deny文件中加入‘ALL’ echo ALL >>/etc/cron.deny
关闭Apport Apport是内部错误报告程序,它收集系统崩溃信息。关闭方法如下: vi /etc/default/apport 把enabled改为0 # set this to 0 to disable apport, or to 1 to enable it # you can temporarily override this with # sudo service apport start force_start=1 enabled=0
移除Apport apt-get purge apport
关闭atd at命令用来定时执行命令,但是不同于cron,at任务只执行一次。如果你用cron,你也许不需要这个服务。 echo 'manual' > /etc/init/atd.override
移除at apt-get purge at
关闭Avahi Avahi 是 zeroconf 协议的实现。它可以在没有 DNS 服务的局域网里发现基于 zeroconf 协议的设备和服务。它跟mDNS 一样。 cd /etc/init touch avahi-daemon.override echo "manual" > avahi-daemon.override
移除Avahi apt-get remove avahi-daemon avahi-utils
关闭蓝牙(Bluetooth) 第一种关闭方法 vi /etc/rc.local 在exit 0之前加入 rfkill block bluetooth 第二种关闭方法 vi /etc/bluetooth/main.conf 设置InitiallyPowered为false InitiallyPowered = false
禁用Ctrl+Alt+Delete 你不想以外重启服务器,编辑control-alt-delete.conf关闭 vi /etc/init/control-alt-delete.conf 删除或注释掉下面一行 #exec shutdown -r now "Control-Alt-Delete pressed"
关闭Cups CUPS给Unix/Linux用户提供了一种可靠有效的方法来管理打印。它支持IPP,并提供了LPD,SMB(服务消息块,如配置为微软WINDOWS的打印机)、JetDirect等接口。CUPS还可以浏览网络打印机。 echo "manual" > /etc/init/cups.override
卸载Cups apt-get remove cups
关闭Dovecot Dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持 Linux/Unix 系统。 POP / IMAP 是 MUA 从邮件服务器中读取邮件时使用的协议。 apt-get purge dovecot-*
关闭NFS NFS是Unix/Linux/BSD操作系统的网络文件分享程序。无用的服务 NFS服务包含如下几个包: nfs-kernel-server nfs-common portmap rpcbind autofs apt-get purge nfs-kernel-server nfs-common portmap rpcbind autofs
关闭SNMP服务 简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统。如果你不需要这个服务,你可以移除它: apt-get purge --auto-remove snmp
关闭Telnet Telnet默认没有安装,最好不要安装。 apt-get purge telnetd inetutils-telnetd telnetd-ssl
关闭Whoopsie Whoopsie这个服务使用来发送崩溃log到ubuntu。为了关闭它,编辑文件: vi /etc/default/whoopsie 把report_crashes参数改为false report_crashes=false
卸载Whoopsie apt-get purge whoopsie
关闭Wireless 现在主流的主板都集成了Wireless适配器,在服务器环境中是没有用的。 vi /etc/network/interfaces 加入下面一行 iface wlan0 inet manual service network-manager restart
关闭 Zeitgeist Zeitgeist 是 Ubuntu 上用来记录用户行为和事件的服务,包括文件打开、网站访问、对话等等,其他应用程序可访问这些记录下来的信息。 apt-get purge zeitgeist-core zeitgeist-datahub python-zeitgeist rhythmbox-plugin-zeitgeist zeitgeist
禁用编译器 编译器可以被攻击者用来编译攻击你服务器的恶意软件。生产环境通常不需要它。 chmod 000 /usr/bin/byacc chmod 000 /usr/bin/yacc chmod 000 /usr/bin/bcc chmod 000 /usr/bin/kgcc chmod 000 /usr/bin/cc chmod 000 /usr/bin/gcc chmod 000 /usr/bin/*c++ chmod 000 /usr/bin/*g++ 如果你需要使用编译器,执行: chmod 755 /usr/bin/byacc chmod 755 /usr/bin/yacc chmod 755 /usr/bin/bcc chmod 755 /usr/bin/kgcc chmod 755 /usr/bin/cc chmod 755 /usr/bin/gcc chmod 755 /usr/bin/*c++ chmod 755 /usr/bin/*g++
实现IP检测 如果有人hack进入到你的账户,确保你可以得到通知信息,并得到黑客的地址。 为了实现这个,简单的编辑.bash_profile 或 .profile: vi .bash_profile 加入以下文本: echo 'ALERT - ACCESS GRANTED on:' `date` `who` | mail -s "ALERT - ACCESS GRANTED from `who | awk '{print $6}'`" admin@domain.com
安装Fail2Ban 带有最基本的SSH配置是不安全的。Fail2Ban提供了一个方法自动检测和保护服务器被攻击者攻击。这个程序通过扫描log文件并对不信任的行为作出反应,想登录尝试失败。 安装Fail2Ban命令 apt-get install fail2ban 创建config配置文件 Fail2Ban运行需要正确的配置文件,默认配置文件在/etc/fail2ban/jail.conf,但是这个文件并不是你需要的。你应该自己创建 .local文件。 cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local vi /etc/fail2ban/jail.local Fail2Ban SSH 配置 [ssh] enabled = true port = your port number or ssh filter = sshd logpath = /var/log/auth.log maxretry = 2 [ssh-ddos] enabled = true port = your port number or ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 2 邮件通知 destemail = admin@domain.com action = %(action_mwl)s 重启Fail2Ban service fail2ban restart 检查状态 fail2ban-client status 检查iptables规则 iptables -L
安装PSAD 端口扫描攻击检测(psad)是一个很好的可以检测很多扫描攻击的软件。它分析iptables log信息检测端口扫描和其他可疑流量。 安装PSAD apt-get install psad 编辑配置文件 vi /etc/psad/psad.conf 在你做任何改变之前,确保HOSTNAME参数设置正确。然后更新下面参数: EMAIL_ADDRESSES: 你的email地址 HOSTNAME: 你的hostname ENABLE_AUTO_IDS:改成Y,如果你想让PSAD自己做决定 ENABLE_AUTO_IDS_EMAILS:Y,接收邮件 加入iptables规则 iptables -A INPUT -j LOG iptables -A FORWARD -j LOG 重启psad psad -R psad --sig-update psad -H 查看psad状态 psad --Status
Postfix 确保Postfix以非root用户运行 ps aux | grep postfix | grep -v '^root' 改变权限和所有者 chmod 755 /etc/postfix chmod 644 /etc/postfix/*.cf chmod 755 /etc/postfix/postfix-script* chmod 755 /var/spool/postfix chown root:root /var/log/mail* chmod 600 /var/log/mail* 配置更新 vi /etc/postfix/main.cf 修改myhostname myhostname = server.domain.com 配置Postfix接口监听地址 mydestination = $myhostname, localhost.$mydomain, localhost inet_interfaces = localhost 配置网络 mynetworks = 10.0.0.0/16, 192.168.1.0/24, 127.0.0.1 配合SMTP服务 mydomain = domain.com myorigin = domain.com relay_domains = domain.com smtpd_banner = $myhostname 限制拒绝服务攻击 Limit Denial of Service Attacks: default_process_limit = 100 smtpd_client_connection_count_limit = 10 smtpd_client_connection_rate_limit = 30 queue_minfree = 20971520 header_size_limit = 51200 message_size_limit = 10485760 smtpd_recipient_limit = 100 关闭 SMTP VRFY 命令 disable_vrfy_command = yes smtpd_delay_reject = yes smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_hostname smtpd_helo_restrictions = reject_invalid_hostname 限制 Postfix SMTP 服务申请 RCPT TO 命令 smtpd_recipient_restrictions = reject_invalid_hostname, // Reject email if it not valid hostname reject_non_fqdn_hostname, // Reject email if it not valid FQDN reject_non_fqdn_sender, // Reject the request when the MAIL FROM address is not in fully-qualified domain form. For example email send from xyz or abc is rejected. reject_non_fqdn_recipient, // Reject the request when the RCPT TO address is not in fully-qualified domain form reject_unknown_sender_domain, // Reject email, if sender domain does not exists reject_unknown_recipient_domain, // Reject email, if recipient domain does not exists permit_mynetworks, reject_rbl_client list.dsbl.org, // Configure spam black lists reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, permit 设置错误睡眠时间,软硬错误限制 smtpd_error_sleep_time = 1s smtpd_soft_error_limit = 10 smtpd_hard_error_limit = 20 Forward emails vi /etc/postfix/virtual 一行中两个email地址 email1@domain.com email2@domain.com email1@domain.com的所有邮件转到email2@domain.com 重启Postfix service postfix restart
Apache 用户和组 groupadd webuser useradd -d /var/www/ -g webuser -s /bin/nologin webuser 编辑 etc/apache2/envvars vi etc/apache2/envvars User webuser Group webuser 限制本地访问 chown -R 750 /etc/apache2/bin /etc/apache2/conf chmod 511 /usr/sbin/apache2 chmod 750 /var/log/apache2/ chmod 750 /etc/apache2/conf/ chmod 640 /etc/apache2/conf/* chgrp -R <MyApacheUser> /etc/apache2/conf 限制目录访问 vi /etc/apache2/apache2.conf 增加 <Directory /> Options None Order deny,allow Deny from all </Directory> 重启apache /etc/init.d/apache2 restart 关闭目录清单 <Directory /var/www/html> Options -Indexes </Directory> XSS 保护 vi /etc/apache2/apache2.conf <IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule> 重启Apache /etc/init.d/apache2 restart 点击劫持攻击 点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情 的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。 vi /etc/apache2/apache2.conf <IfModule mod_headers.c> Header always append X-Frame-Options SAMEORIGIN </IfModule> 关闭 Etag Etag 允许远程攻击者获取敏感信息 FileETag None 关闭老协议 RewriteEngine On RewriteCond %{THE_REQUEST} !HTTP/1.1$ RewriteRule .* - [F] 关闭SSI SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。SSI允许攻击者远程注入恶意脚本。 <Directory /path/to/htdocs> Options -Indexes -Includes Order allow,deny Allow from all </Directory> 关闭CGI <Directory /path/to/htdocs> Options -Indexes -Includes -ExecCGI Order allow,deny Allow from all </Directory> 关闭追踪HTTP请求 vi /etc/apache2/apache2.conf TraceEnable off 关闭不需要的模块 列出所有打开的模块命令 apache2 -l 关闭模块可以用 a2dismod 命令,打开用a2enmod命令 a2dismod <module> 关闭apache的符号链接 <Directory /path/to/www> Options -FollowSymLinks </Directory>l; 如果你想在特定的网站打开符号链接,在网站的.htaccess写入: <Directory /path/to/some_www> Options +FollowSymLinks </Directory>l; 限制http请求大小 apache没有限制http请求大小,这就是说,无限大的数据可以发送给apache服务器。hacker可以用这个实现拒绝服务攻击。 <Directory "/path/to/www/"> LimitRequestBody 512000 </Directory> 配置超时时间(Timeout) 默认300秒,可以适当减少 Timeout 45 隐藏Apache信息 vi /etc/apache2/apache2.conf ServerTokens Prod ServerSignature Off <IfModule mod_headers.c> Header unset Server Header unset X-Powered-By </IfModule> 重启apache /etc/init.d/apache2 restart HTTP请求方法 vi /etc/apache2/apache2.conf <LimitExcept GET POST HEAD> deny from all </LimitExcept> 例如: <Location /> Order allow,deny Allow from all <LimitExcept HEAD POST GET> Deny from all </LimitExcept> </Location> 重启; HTTPOnly Cookie vi /etc/apache2/apache2.conf <IfModule mod_headers.c> Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure </IfModule> 重启; 屏蔽IP地址 <Limit GET POST PUT> Order Allow,Deny Allow from all Deny from 1.1.1.1 </Limit>
ModSecurity ModSecurity是一个开源的网络应用防火墙。它可以嵌入到web服务或做为独立的网络应用工作,检测并阻止攻击者攻击web服务。 在安装 ModSecurity 之前,先要安装依赖: 32位: apt-get install libxml2 libxml2-dev libxml2-utils apt-get install libaprutil1 libaprutil1-dev 64位: ln -s /usr/lib/x86_64-linux-gnu/libxml2.so.2 /usr/lib/libxml2.so.2 apt-get install libapache-mod-security 配置 ModSecurity 规则 激活默认规则: mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf 你可以根据需要配置规则,ModSecurity的规则目录在/etc/modsecurity/。 vi /etc/modsecurity/modsecurity.conf SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 131072 SecRequestBodyNoFilesLimit 131072 SecRequestBodyInMemoryLimit 131072 SecRequestBodyLimitAction ProcessPartial SecResponseBodyAccess Off 下载安装 OWASP Core Rule Set cd /tmp wget -O SpiderLabs-owasp-modsecurity-crs.tar.gz https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master tar -zxvf SpiderLabs-owasp-modsecurity-crs.tar.gz cp -R SpiderLabs-owasp-modsecurity-crs-*/* /etc/modsecurity/ rm SpiderLabs-owasp-modsecurity-crs.tar.gz rm -R SpiderLabs-owasp-modsecurity-crs-* mv /etc/modsecurity/modsecurity_crs_10_setup.conf.example /etc/modsecurity/modsecurity_crs_10_setup.conf cd /etc/modsecurity/base_rules for f in * ; do ln -s /etc/modsecurity/base_rules/$f /etc/modsecurity/activated_rules/$f ; done cd /etc/modsecurity/optional_rules for f in * ; do ln -s /etc/modsecurity/optional_rules/$f /etc/modsecurity/activated_rules/$f ; done vi /etc/apache2/mods-available/mod-security.conf Include "/etc/modsecurity/activated_rules/*.conf" 检查 ModSecurity 是否开启并重启apache a2enmod headers a2enmod mod-security /etc/init.d/apache2 restart
安装ModEvasive apt-get install libapache2-mod-evasive 为 mod_evasive 创建log目录 mkdir /var/log/mod_evasive 改目录权限 chown www-data:www-data /var/log/mod_evasive/ // www or user 配置ModEvasive vi /etc/apache2/mods-available/mod-evasive.conf <ifmodule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 10 DOSLogDir /var/log/mod_evasive DOSEmailNotify email@domain.com DOSWhitelist 127.0.0.1 </ifmodule> 修复Mod-Evasive 邮件bug ln -s /etc/alternatives/mail /bin/mail/ 检查ModEvasive状态 a2enmod mod-evasive 重启apache /etc/init.d/apache2 restart
Ubuntu 防火墙 安装UFW: apt-get install ufw 允许SSH和HTTP服务 ufw allow ssh ufw allow http ufw deny 23 ufw default deny 打开防火墙 ufw enable 查看防火墙状态 ufw status verbose 查看iptable设置 iptables -L 配置UFW: vi /etc/ufw/before.rules 在 *filter 下加入 :ufw-http - [0:0] :ufw-http-logdrop - [0:0] 在COMMIT之前加入 ### Start HTTP ### # Enter rule -A ufw-before-input -p tcp --dport 80 -j ufw-http -A ufw-before-input -p tcp --dport 443 -j ufw-http # Limit connections per Class C -A ufw-http -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 24 -j ufw-http-logdrop # Limit connections per IP -A ufw-http -m state --state NEW -m recent --name conn_per_ip --set -A ufw-http -m state --state NEW -m recent --name conn_per_ip --update --seconds 10 --hitcount 20 -j ufw-http-logdrop # Limit packets per IP -A ufw-http -m recent --name pack_per_ip --set -A ufw-http -m recent --name pack_per_ip --update --seconds 1 --hitcount 20 -j ufw-http-logdrop # Finally accept -A ufw-http -j ACCEPT # Log -A ufw-http-logdrop -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW HTTP DROP] " -A ufw-http-logdrop -j DROP ### End HTTP ### 防止Ping Flood 攻击,在COMMIT之前加入 -A INPUT -p icmp -m limit --limit 6/s --limit-burst 1 -j ACCEPT -A INPUT -p icmp -j DROP 关闭IPv6 vi /etc/default/ufw IPV6=no 重新加载ufw配置 ufw reload
IP Spoofing IP Spoofing技术是指一种获取对计算机未经许可的访问的技术,即攻击者通过伪 IP 地址向计算机发送信息,并显示该信息来自于真实主机。 为防止IP Spoofing,编辑 vi /etc/host.conf 增加 order bind,hosts nospoof on
PHP vi /etc/php5/apache2/php.ini 安全模式 safe_mode = On safe_mode_gid = On sql.safe_mode=On 如果你想限制可执行文件的目录,加入 safe_mode_include_dir = /path/to/dir safe_mode_exec_dir = /path/to/exec/dir 关闭Globals register_globals = Off 隐藏PHP信息 expose_php = Off track_errors = Off html_errors = Off 隐藏PHP的所有错误信息 display_errors = Off 关闭Functionalities: disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace, tmpfile, link, ignore_user_abord, shell_exec, dl, set_time_limit, exec, system, highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_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_times, posix_ttyname, posix_uname, proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo 关闭远程文件包含 allow_url_fopen = Off allow_url_include = Off 限制文件上传 file_uploads = Off 如果你需要这个上传功能,你应该限制文件大小和上传目录 upload_tmp_dir = /var/php_tmp upload_max_filezize = 2M 资源控制 max_execution_time = 10 max_input_time = 30 memory_limit = 40M 控制POST大小 post_max_size=1K 保护Sessions session.cookie_httponly = 1 session.referer_check = domain.com magic_quotes_gpc magic_quotes_gpc=Off 重启apache
Suhosin Suhosin是php的保护系统。 安装suhosin apt-get install php5-suhosin 配置suhosin vi /etc/php5/conf.d/suhosin.ini 打开suhosin extension=suhosin.so 关闭session加密 suhosin.session.encrypt = Off 日志所有错误 suhosin.log.syslog=511 最大traversal,设置最深路径 suhosin.executor.include.max_traversal=4 关闭eval suhosin.executor.disable_eval=On 关闭 /e modifier suhosin.executor.disable_emodifier=On suhosin.mail.protect=2 sql错误静音 suhosin.sql.bailout_on_error=On 过滤选项 suhosin.cookie.max_vars = 2048 suhosin.get.max_array_index_length = 256 suhosin.post.max_array_index_length = 256 suhosin.post.max_totalname_length = 8192 suhosin.post.max_vars = 2048 suhosin.request.max_totalname_length = 8192 suhosin.request.max_varname_length = 256
iptables 限制SSH的接入连接 下面这个例子忽略22端口在60秒内尝试超过5次连接 iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP 使用端口碰撞 iptables -N stage1 iptables -A stage1 -m recent --remove --name knock iptables -A stage1 -p tcp --dport 3456 -m recent --set --name knock2 iptables iptables -N stage2 iptables -A stage2 -m recent --remove --name knock2 iptables -A stage2 -p tcp --dport 2345 -m recent --set --name heaven iptables iptables -N door iptables -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2 iptables -A door -m recent --rcheck --seconds 5 --name knock -j stage1 iptables -A door -p tcp --dport 1234 -m recent --set --name knock iptables iptables -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT iptables -A INPUT -p tcp --syn -j doo 阻止端口扫描 试图进行端口扫描的锁定一天 iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP iptables -A INPUT -m recent --name portscan --remove iptables -A FORWARD -m recent --name portscan --remove 把扫描者加入扫描列表并log iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:" iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:" iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP 强制SYN包检查 iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP drop空包 iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP drop ping iptables -A OUTPUT -p icmp -o eth0 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -s 0/0 -i eth0 -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -s 0/0 -i eth0 -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -s 0/0 -i eth0 -j ACCEPT iptables -A INPUT -p icmp -i eth0 -j DROP 屏蔽IP iptables -A INPUT -s 1.1.1.1 -j DROP iptables -A INPUT -s 192.168.0.0/24 -j DROP 备份规则 iptables-save > /root/my.active.firewall.rules 修复规则 iptables-restore < /root/my.active.firewall.rules
获取(D)D0S更多信息 netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
加固SSH SSH加固是服务器安全重要一步,所有配置都在 /etc/ssh/sshd_config vi /etc/ssh/sshd_config 限制用户访问 AllowUsers user1 user2 //允许 DenyUser user3 user_4//拒绝 关闭root登录 PermitRootLogin no 在系统中所有空密码的用户禁止登录 PermitEmptyPasswords no 不允许用户设置环境变量 PermitUserEnvironment no 隐藏最后一次登录 PrintLastLog no 指定Ip可以用SSH访问 ListenAddress 1.1.1.1 只用协议2 Protocol 2 更改默认端口 Port 2345 关闭UseDNS UseDNS no 设置空闲超时时间 ClientAliveInterval 300 ClientAliveCountMax 0 关闭 .rhosts 文件 IgnoreRhosts yes RhostsAuthentication no RhostsRSAAuthentication no RSAAuthentication yes 关闭Host-Based Authentication HostbasedAuthentication no LoginGraceTime LoginGraceTime 300 MaxStartups,防止暴力脚本攻击 MaxStartups 2 关闭Forwarding AllowTcpForwarding no X11Forwarding no 严厉模式 StrictModes yes 使用TCP Wrappers sshd : 192.168.1.2 1.1.1.1
查看logs:一些重要的日志信息 /var/log/messages 系统主日志 /var/log/auth.log 验证日志 /var/log/kern.log 内核日志 /var/log/cron.log 计划任务日志 /var/log/maillog 邮件服务日志 /var/log/boot.log 系统启动日志 /var/log/mysqld.log mysql数据库服务日志 /var/log/secure 验证日志 /var/log/ufw.log 防火墙日志 /var/log/utmp 或 /var/log/wtmp 登录记录文件
用 LogWatch 分析日志 apt-get install logwatch libdate-manip-perl 查看报告 logwatch | less
相关主题 |