黑帽联盟

 找回密码
 会员注册
查看: 1339|回复: 0
打印 上一主题 下一主题

[系统安全] linux系统安全加固(推荐)

[复制链接]

895

主题

38

听众

3323

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 1644 天

    [LV.Master]伴坛终老

    1 、 BIOS
    你应该总是在系统启动的时候设置一个BIOS 密码和禁用从CD-ROM 和软盘引导,这将可以防止一些人未经允许访问你的系统和更改BIOS 设置

    2 、sshd 服务
    SSH 是一个协议,利用它可以登录到一个远程系统或远程执行系统命令,默认允许root 登录,并且sshv1存在缺陷,我们应该在sshd_config 禁止root 访问和使用sshv2 来让ssh 更加安全
    #vi /etc/ssh/sshd_config
    Protocol 2
    PermitRootLogin = no
    #sshd /etc/rc.d/init.d/sshd restart
    3 、 禁用 telnet
    早期的Linux 默认开启telnet 服务,telnet,ftp,rlogin 都是明文传输的协议是容易被嗅探到的,这就是为什么推荐使用安全的版本(sftp,scp,ssh )的原因,如果你必须要使用telnet ,那么至少应该隐藏banner 信息
    #vi   /etc/xinetd.d/telnet
    disable=yes

    4 、 禁用代码编译
    你可以禁用代码编译并且只把编译的权限分配给一个用户组
    # 该组的成员可以编译代码
    /usr/sbin/groupadd compiler
    # 把常见的编译器所属组赋给编译用户组
    chgrp compiler /usr/bin/*cc*   
    chgrp compiler /usr/bin/*++*
    chgrp compiler /usr/bin/ld
    chgrp compiler /usr/bin/as
    # 设置mysqlaccess 的 访问
    chgrp root mysqlaccess
    # 设置权限
    chmod 750 /usr/bin/*cc*
    chmod 750 /usr/bin/*++*
    chmod 750 /usr/bin/ld
    chmod 750 /usr/bin/as
    chmod 755 /usr/bin/mysqlaccess
    # 把用户添加到组里
    vi /etc/group
    compiler:x:520:user1,user2
    5 、ProFTP
    # 修改proftpd.conf 来禁止root 登陆
    vi /etc/proftpd.conf
    Add RootLogin off
    /sbin/service proftpd restart

    6 、TCP wrappers
    编辑hosts.allow 和hosts.deny 可以限制或允许访问inet 服务
    vi   /etc/hosts.allow
    #Approved IP addresses
    ALL:192.168.0.1
    ALL:192.168.5.2
    #CSV uploader machine
    proftpd:10.0.0 .5
    #pop3 from antwhere
    ipop3:ALL
    vi /etc/hosts.deny
    ALL:ALL EXCEPT localhostENY

    7 、创建su 用户组
    因为我们在SSH 禁止了root 用户访问并且禁用了telnet ,所有我们应该分配给一些用户su 权限来获取root 特权
    vi /etc/group ,添加一行如下
    wheel:x:10:root,user1,user2
    chgrp wheel /bin/su
    chmod o-rwx /bin/su
    说明:或者直接使用pam 模块来做,再则也可以编译/etc/sudoers 来做

    8 、root 通知
    当一个具有root 权限的用户登录的时候发mail ,具体实施方法如下:
    vi /root/.bashrc ,当有root 权限的用户登录时发生email 通知
    echo ‘ALERT – Root Shell Access (Server Name) on:’ `date` `who` | mail -s “Alert: Root Access from `who | cut -d”(” -f2 | cut -d”)” -f1`” your@email.com

    9 、history 安全
    这是一个避免删除.bash_history 或重定向到/dev/null 的好主意,因此他不能清除或删除他最后执行的命令
    chattr +a .bash_history
    chattr +i .bash_history
    获取用户的人会知道他的历史命令锁定并且要同意才可以使用服务

    10 、使用欢迎信息
    你必须提供一些信息让攻击者知道该系统不对公众开放,在国外有类似案件,攻击者入侵一个系统并且系统没有这些信息,这种情况下法院不能做任何裁决,因为系统说welcome
    1 )删除/etc/redhat-release
    2 )编辑/etc/issue 与/etc/motd 并显示警告信息

    11 、禁用所有特殊账户
    # 你应该从系统中删除所有默认用户和组
    例如news,lp,sync,shutdown,uucp,games,halt 等
    userdel name
    groupdel name
    # 锁定特定账户
    /usr/sbin/usermod -L -s /bin/false user

    12 、chmod 危险文件
    这可能是限制不具有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

    13 、指定允许root 登陆的TTY 设备
    因为/etc/securetty 文件允许你指定root 可以从哪个TTY 设备登录
    vi /etc/securetty ,然后只留2 个连接
    tty1
    tty2

    14 、选择一个安全的密码
    在/etc/login.defs 文件中定义了shadow 密码的具体配置,默认密码长度最短为5 字符,你应该至少设置为8
    vi   /etc/login.defs
    PASS_MIN_LEN   8

    15 、检测Rootkit
    用chkrootkit 或rkhunter ,以chkrootkit 为例
    wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
    wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.md5
    md5sum chkrootkit.tar.gz  # 首先检查md5 校验值
    tar -zxvf chkrootkit.tar.gz
    cd chkrootkit
    ./configure && make sense
    然后运行./chkrootkit
    我们可以将其添加到contrab 使其每天自动扫描:
    vi /etc/cron.daily/chkrootkit.sh
    #!/bin/bash
    # 输入chkrootkit 的安装目录
    cd /root/chkrootkit/
    # 输入你想收到检测报告的email
    ./chkrootkit | mail -s “Daily chkrootkit from Server Name” your@email.com

    16 、安装补丁
    你要经常检查更新以修复某些缺陷或系统稳定性的改进,否则你存在漏洞的系统将会不时的遭受新的攻击
    # 列出可用更新
    up2date -l
    # 安装未排除的更新
    up2date -u
    # 安装包括排除的更
    up2date -uf

    17 、隐藏Apache 信息
    你应该隐藏Apache 的banner 信息使攻击者不知道Apache 的版本,从而使他们难以利用漏洞
    vi /etc/httpd/conf/httpd.conf
    # 改变服务器签名
    ServerSignature Off
    service httpd restart

    18 、隐藏php 信息
    你应该隐藏php 的banner 信息,原因同上
    vi php.ini
    expose_php=Off
    service apache restart
    19 、关闭不用的服务
    你应该把任何未使用的服务关闭,可以在/etc/xinetd.d 文件夹里找到
    cd /etc/xinetd.d
    grep disable * | column  -t
    这将显示所有服务开启或关闭的状态,然后根据需要来开启或关闭服务

    20 、检测监听的端口
    检测是否有必要开放端口是非常重要的
    netstat -tulp 或 lsof -i -n | egrep ‘COMMAND|LISTEN|UDP’ 或 nmap !
    21 、关闭端口和服务
    重点是关闭在系统启动时打开的不需要的端口,方法如下:
    # 对于正在运行的服务,可以执行
    chkconfig -list | grep on
    # 禁用服务可以执行
    chkconfig servicename off
    # 然后停止正在运行的服务
    /etc/init.d/service stop

    22 、删除不用的rpm 包
    首先应该清楚你的系统的作用,它是web,mail,file 服务器或其他,然后觉得哪些包是必要的,之后删除不需要的软件包,方法如下:
    # 首先列出安装列表
    rpm -qa
    # 更详细的信息
    rpm -qi rpmname
    # 还可以检测删除包可能出现的冲突
    rpm -e --test rpmname

    23 、禁用危险的php 函数
    你应该禁用php 的危险函数防止在网站上执行系统命令whereis php.ini
    vi /usr/local/lib/php.ini
    disable_functions = “symlink,shell_exec,exec,proc_close,proc_open,popen,
    system,dl,passthru,escapeshellarg, escapeshellcmd”

    24 、安装配置防火墙
    高级策略防火墙(APF )是一种IP 表(网络过滤),它是基于当今互联网部署服务器防火墙系统的基本需要和客户部署LINUX 安装的唯一需要而设计的。 它是最好的开源防火墙之一
    1 )配置APF 防火墙方法:
    wget http://www.r-fx.ca/downloads/apf-current.tar.gz
    tar -zxvf apf-current.tar.gz
    cd apf-0.9.7 -1
    ./install.sh
    2 )vi /etc/apf/conf.apf ,一般配置如下
    启用防火墙使用DShield.org 块列表
    USE_DS=”1″
    然后我将列出常规的配置和CPanel 配置方式,因为CPanel 是应该最广泛的虚拟主机管理软件

    (1 )常规配置(DNS,Mail,Web,FTP)
    Common ingress (inbound)
    # Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,995″
    # Common ingress (inbound) UDP ports IG_UDP_CPORTS=”53″
    # Egress filtering [0 = Disabled / 1 = Enabled]
    EGF=”1″
    # Common egress (outbound) TCP ports
    EG_TCP_CPORTS=”21,25,80,443,43″
    # Common egress (outbound) UDP ports
    EG_UDP_CPORTS=”20,21,53″

    (2 )CPanel 配置
    Common ingress (inbound) ports
    # Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD IG_TCP_CPORTS=”21,22,25,53,80,110,143,443,2082,2083, 2086,2087,2095, 2096,3000_3500″
    # Common ingress (inbound) UDP ports
    IG_UDP_CPORTS=”53″
    Common egress (outbound) ports
    # Egress filtering [0 = Disabled / 1 = Enabled]
    EGF=”1″
    # Common egress (outbound) TCP ports
    EG_TCP_CPORTS=”21,25,80,443,43,2089″
    # Common egress (outbound) UDP ports
    EG_UDP_CPORTS=”20,21,53″
    之后启动防火墙:/etc/apf/apf -s ,如果运行良好我在回去修改配置文件,使DEVM=”0″

    (3 )配置APF 的AntiDos
    vi /etc/apf/ad/conf.antidos ,找到下面的内容并替换成你的资料
    # Organization name to display on outgoing alert emails
    CONAME=”Your Company”
    # Send out user defined attack alerts [0=off,1=on]
    USR_ALERT=”0″
    # User for alerts to be mailed to
    USR=you@yourco.com
    你应把USR_ALERT 改为1
    保存后重启APF :/etc/apf/apf –r
    To make the firewall start with the Operating System: chkconfig –level 2345 apf on
    APF 开机自启动:chkconfig –level 2345 apf on
    禁止一个IP 用/etc/apf/apf -d ip 或vi /etc/apf/deny_hosts.rules
    允许一个IP 用/etc/apf/apf -a ip 或vi /etc/apf/deny_hosts.rules

    25 、安装配置BFD (暴力破解检测)
    BFD 是一个用于分析应用日志和检测验证失败的模块化shell 脚本,而且安装配置和用法都是非常容易的。使用BFD 的原因很简单,其实在LINUX 领域几乎没有结合防火墙或实时设备来监控不验证和暴力攻击审计的程序。在用BFD 之前你必须安装APF 防火墙
    wget http://www.r-fx.ca/downloads/bfd-current.tar.gz
    tar -zxvf bfd-current.tar.gz
    cd bfd-0.9
    vi /usr/local/bfd/conf.bfd
    # 把以下内容改为你的资料
    # Enable/disable user alerts [0 = off; 1 = on]
    ALERT_USR=”1″
    # User alert email address
    EMAIL_USR=”your@mail.com”
    # User alert email; subject
    SUBJ_USR=”Brute Force Warning for $HOSTNAME”
    vi /usr/local/bfd/ignore.hosts ,然后把你的IP 设置成允许主机,避免意外的锁定自己
    # 重启BFD
    /usr/local/sbin/bfd -s

    26 、内核加固(sysctl.conf )
    sysctl.conf 用来加固内核,目的是避免DOS 和欺骗攻击,具体的方法如下:
    # 了解下当前配置的大概情况
    sysctl -a
    vi /etc/sysctl.conf
    添加如下内容:
    # Kernel sysctl configuration file for Red Hat Linux
    # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
    # sysctl.conf(5) for more details.
    # Controls IP packet forwarding
    net.ipv4.ip_forward = 0
    # Controls source route verification
    net.ipv4.conf.default.rp_filter = 1
    # Controls the System Request debugging functionality of the kernel
    kernel.sysrq = 0
    # Controls whether core dumps will append the PID to the core filename.
    # Useful for debugging multi-threaded applications.
    kernel.core_uses_pid = 1
    #Prevent SYN attack
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_max_syn_backlog = 2048
    net.ipv4.tcp_synack_retries = 2
    # Disables packet forwarding
    net.ipv4.ip_forward=0
    # Disables IP source routing
    net.ipv4.conf.all.accept_source_route = 0
    net.ipv4.conf.lo.accept_source_route = 0
    net.ipv4.conf.eth0.accept_source_route = 0
    net.ipv4.conf.default.accept_source_route = 0
    # Enable IP spoofing protection, turn on source route verification
    net.ipv4.conf.all.rp_filter = 1
    net.ipv4.conf.lo.rp_filter = 1
    net.ipv4.conf.eth0.rp_filter = 1
    net.ipv4.conf.default.rp_filter = 1
    # Disable ICMP Redirect Acceptance
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.lo.accept_redirects = 0
    net.ipv4.conf.eth0.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    # Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
    net.ipv4.conf.all.log_martians = 1
    net.ipv4.conf.lo.log_martians = 1
    net.ipv4.conf.eth0.log_martians = 1
    # Disables IP source routing
    net.ipv4.conf.all.accept_source_route = 0
    net.ipv4.conf.lo.accept_source_route = 0
    net.ipv4.conf.eth0.accept_source_route = 0
    net.ipv4.conf.default.accept_source_route = 0
    # Enable IP spoofing protection, turn on source route verification
    net.ipv4.conf.all.rp_filter = 1
    net.ipv4.conf.lo.rp_filter = 1
    net.ipv4.conf.eth0.rp_filter = 1
    net.ipv4.conf.default.rp_filter = 1
    # Disable ICMP Redirect Acceptance
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.lo.accept_redirects = 0
    net.ipv4.conf.eth0.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    # Disables the magic-sysrq key
    kernel.sysrq = 0
    # Modify system limits for Ensim WEBppliance
    fs.file-max = 65000
    # Decrease the time default value for tcp_fin_timeout connection
    net.ipv4.tcp_fin_timeout = 15
    # Decrease the time default value for tcp_keepalive_time connection
    net.ipv4.tcp_keepalive_time = 1800
    # Turn off the tcp_window_scaling
    net.ipv4.tcp_window_scaling = 0
    # Turn off the tcp_sack
    net.ipv4.tcp_sack = 0
    # Turn off the tcp_timestamps
    net.ipv4.tcp_timestamps = 0
    # Enable TCP SYN Cookie Protection
    net.ipv4.tcp_syncookies = 1
    # Enable ignoring broadcasts request
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    # Enable bad error message Protection
    net.ipv4.icmp_ignore_bogus_error_responses = 1
    # Log Spoofed Packets, Source Routed Packets, Redirect Packets
    net.ipv4.conf.all.log_martians = 1
    # Set maximum amount of memory allocated to shm to 256MB
    kernel.shmmax = 268435456
    # Improve file system performance
    vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
    # Improve virtual memory performance
    vm.buffermem = 90 10 60
    # Increases the size of the socket queue (effectively, q0).
    net.ipv4.tcp_max_syn_backlog = 1024
    # Increase the maximum total TCP buffer-space allocatable
    net.ipv4.tcp_mem = 57344 57344 65536
    # Increase the maximum TCP write-buffer-space allocatable
    net.ipv4.tcp_wmem = 32768 65536 524288
    # Increase the maximum TCP read-buffer space allocatable
    net.ipv4.tcp_rmem = 98304 196608 1572864
    # Increase the maximum and default receive socket buffer size
    net.core.rmem_max = 524280
    net.core.rmem_default = 524280
    # Increase the maximum and default send socket buffer size
    net.core.wmem_max = 524280
    net.core.wmem_default = 524280
    # Increase the tcp-time-wait buckets pool size
    net.ipv4.tcp_max_tw_buckets = 1440000
    # Allowed local port range
    net.ipv4.ip_local_port_range = 16384 65536
    # Increase the maximum memory used to reassemble IP fragments
    net.ipv4.ipfrag_high_thresh = 512000
    net.ipv4.ipfrag_low_thresh = 446464
    # Increase the maximum amount of option memory buffers
    net.core.optmem_max = 57344
    # Increase the maximum number of skb-heads to be cached
    net.core.hot_list_length = 1024
    ## DO NOT REMOVE THE FOLLOWING LINE!
    ## nsobuild:20051206
    # 重启后生效
    /sbin/sysctl -p
    sysctl -w net.ipv4.route.flush=1
    27 、更改SSH 端口
    更改SSH 默认端口号在一定程度上可以提高安全性
    vi /etc/ssh/sshd_config
    Port 22 改为其他端口
    当然不要忘记把更改的端口加进防火墙,然后重启生效:/etc/init.d/ssh restart ,如果安装了APF 并把端口添加之后,还要重启APF:/etc/init.d/apf restart
    28 、/tmp,/var/tmp,/dev/shm 分区的安全
    /tmp,/var/tmp,/dev/shm 目录是不安全的,任何用户都可以执行脚本,最好的解决办法是挂载nocexec和nosuid 选项的参数( 注意:不建议在CPanel 使用)

    1 )/tmp 目录
    cd /dev
    # 创建 100M (“count”) 的存储文件:
    dd if=/dev/zero of=tmpMnt bs=1024 count=100000
    # 设为一个扩展的文件系统
    /sbin/mke2fs /dev/tmpMnt (“…is not a block special device. continue?” 回答yes)
    # 备份现有临时文件
    cp -R /tmp/ /tmp_backup
    # 用noexec 挂载新文件系统:
    mount -o loop,rw,nosuid,noexec /dev/tmpMnt /tmp
    chmod 0777 /tmp
    # 把备份的文件拷贝回去
    cp -R /tmp_backup/* /tmp/
    # 删除备份
    rm -rf /tmp_backup
    # 修改/etc/fstab 添加下面的条目使其在引导时仍然有效
    /dev/tmpMnt /tmp ext2 loop,rw,nosuid,noexec 0 0

    2 )/var/tmp 目录
    mv /var/tmp /var/tmpbak
    ln -s /tmp /var/tmp
    cp /var/tmpbak/* /tmp/

    3 )/dev/shm 目录
    vi  /etc/fstab
    "none /dev/shm tmpfs defaults,rw 0 0"  改为  "none /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0"

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    勿忘初心,方得始终!
    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部