Linux网络安全经验之谈


  有关分区
  
  个潜在黑客如果要攻击你Linux他首先就会尝试缓冲区溢出在过去几年中以缓冲区溢出为类型漏洞是最为常见种形式了更为严重缓冲区溢出漏洞占了远程网络攻击绝大多数这种攻击可以轻易使得个匿名Internet用户有机会获得台主机部分或全部控制权!
  
  为了防止此类攻击我们从安装系统时就应该注意如果用root分区纪录数据如log文件和email就可能拒绝服务产生大量日志或垃圾邮件从而导致系统崩溃所以建议为/var开辟单独分区用来存放日志和邮件以避免root分区被溢出最好为特殊应用单独开个分区特别是可以产生大量日志还有建议为/home单独分个区这样他们就不能填满/分区了从而就避免了部分针对Linux分区溢出恶意攻击
  
  有关BIOS
  
  记着要在BIOS设置中设定个BIOS密码不接收软盘启动这样可以阻止不怀好意人用专门启动盘启动你Linux系统并避免别人更改BIOS设置如更改软盘启动设置或不弹出密码框直接启动等等
  
  有关口令
  
  口令是系统中认证用户主要手段系统安装时默认口令最小长度通常为5但为保证口令不易被猜测攻击可增加口令最小长度至少等于8为此需修改文件/etc/login.defs中参数PASS_MIN_LEN(口令最小长度)同时应限制口令使用时间保证定期更换口令建议修改参数PASS_MIN_DAYS(口令使用时间)
  
  有关Ping
  
  既然没有人能ping通你机器并收到响应你可以大大增强你站点你可以加下面行命令到/etc/rc.d/rc.local以使每次启动后自动运行这样就可以阻止你系统响应任何从外部/内部来ping请求
  
  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  
  有关Telnet
  
  如果你希望用户用Telnet远程登录到你服务器时不要显示操作系统和版本信息(可以避免有针对性漏洞攻击)你应该改写/etc/inetd.conf中行象下面这样:
  
  telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
  
  加-h标志在最后使得telnet后台不要显示系统信息而仅仅显示login
  
  有关特权账号
  
  禁止所有默认被操作系统本身启动且不需要帐号当你第次装上系统时就应该做此检查Linux提供了各种帐号你可能不需要如果你不需要这个帐号就移走它你有帐号越多就越容易受到攻击
  
  为删除你系统上用户用下面命令:userdel username
  
  为删除你系统上组用户帐号用下面命令:groupdel username
  
  在终端上打入下面命令删掉下面特权用账号:
  
  userdel adm
  
  userdel lp
  
  userdel sync
  
  userdel shutdown
  
  userdel halt
  
  userdel mail
  
  如果你不用sendmail服务器就删除这几个帐号:
  
  userdel s
  
  userdel uucp
  
  userdel operator
  
  userdel games
  
  如果你不用X windows 服务器就删掉这个帐号
  
  userdel gopher
  
  如果你不允许匿名FTP就删掉这个用户帐号:
  
  userdel ftp
  
  有关su命令
  
  如果你不想任何人能够su为root话,你应该编辑/etc/pam.d/su文件加下面几行:
  
  auth sufficient /lib-
  
  /security/pam_rootok-
  
  .so debug
  
  auth required /lib-
  
  /security/pam_wheel-
  
  .so group=isd
  
  这意味着仅仅isd组用户可以su作为root如果你希望用户admin能su作为root.就运行下面命令:
  
  usermod -G10 admin
  
  suid也是非常危险这些被普通用户以euid=0(即root)身份执行只能有少量被设置为suid用这个命令列出系统suid 2进制:
  
  suneagle# find / -perm -4000 -pr
  
  你可以用chmod -s去掉些不需要suid位
  
  有关账户注销
  
  如果系统管理员在离开系统时忘了从root注销系统应该能够自动从shell中注销那么你就需要设置个特殊 Linux 变量“tmout”用以设定时间 同样如果用户离开机器时忘记了注销账户则可能给系统安全带来隐患你可以修改/etc/profile文件保证账户在段时间没有操作后自动从系统注销 编辑文件/etc/profile在“histfilesize=”行行增加如下行:
  
  tmout=600
  
  则所有用户将在10分钟无操作后自动注销注意:修改了该参数后必须退出并重新登录root更改才能生效
  
  有关系统文件
  
  对于系统中某些关键性文件如passwd、passwd.old、passwd._、shadow、shadown._、inetd.conf、services和lilo.conf等可修改其属性防止意外修改和被普通用户查看 如将inetd文件属性改为600:
  
  # chmod 600 /etc/inetd.conf
  
  这样就保证文件属主为root然后还可以将其设置为不能改变:
  
  # chattr +i /etc/inetd.conf
  
  这样对该文件任何改变都将被禁止 你可能要问:那我自己不是也不能修改了?当然我们可以设置成只有root重新设置复位标志后才能进行修改:
  
  # chattr -i /etc/inetd.conf
  
  有关用户资源
  
  对你系统上所有用户设置资源限制可以防止DoS类型攻击如最大进程数内存数量等例如对所有用户限制 编辑/etc/security/limits.con加入以下几行:
  
  * hard core 0
  
  * hard rss 5000
  
  * hard nproc 20
  
  你也必须编辑/etc/pam.d/login文件检查这存在:
  
  session required /lib/security/pam_limits.so
  
  上面命令禁止core files“core 0”限制进程数为“nproc 50“且限制内存使用为5M“rss 5000”
  
  有关NFS服务器
  
  由于NFS服务器漏洞比较多定要小心如果要使用NFS网络文件系统服务那么确保你/etc/exports具有最严格存取权限设置不意味着不要使用任何通配符不允许root写权限mount成只读文件系统你可以编辑文件/etc/exports并且加:
  
  /dir/to/export host1.mydo.com(ro,root_squash)
  
  /dir/to/export host2.mydo.com(ro,root_squash)
  
  其中/dir/to/export 是你想输出目录host.mydo.com是登录这个目录机器名ro意味着mount成只读系统root_squash禁止root写入该目录最后为了让上面改变生效还要运行/usr/sbin/exportfs -a
  
  有关开启服务
  
  默认就是个强大系统运行了很多服务但有许多服务是不需要很容易引起安全风险这个文件就是/etc/inetd.conf它制定了/usr/sbin/inetd将要监听服务你可能只需要其中两个:telnet和ftp其它类如shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth, etc. 除非你真想用它否则统统关闭的
  
  你先用下面命令显示没有被注释掉服务:
  
  grep -v "#" /etc/inetd.conf
  
  这个命令统计面前服务总数:
  
  ps -eaf|wc -l
  
  需要提醒你是以下 3个服务漏洞很多强烈建议你关闭它们:S34yppasswdd(NIS服务器)、S35ypserv(NIS服务器)和S60nfs(NFS服务器)
  
  我们可以运行#killall -HUP inetd来关闭不需要服务当然你也可以运行
  
  #chattr +i /etc/inetd.conf
  
  如果你想使inetd.conf文件具有不可更改属性而只有root 才能解开敲以下命令
  
  #chattr -i /etc/inetd.conf
  
  当你关闭些服务以后重新运行以上命令看看少了多少服务运行服务越少系统自然越安全了我们可以用下面命令察看哪些服务在运行:
  
  netstat -na --ip
  
  如果你用是Redhat那就方便多了^_^ Redhat提供个工具来帮助你关闭服务输入/usr/sbin/up然后选择"system services"就可以定制系统启动时跑哪些服务另外个选择是chkconfig命令很多版本系统都自带这个工具脚本名字中数字是启动顺序以大写K开头是杀死进程用
  
  有关日志
  
  所有日志都在/var/log下(仅对linux系统而言)默认情况下linux日志就已经很强大了但除ftp外因此我们可以通过修改/etc/ftpaccess 或者/etc/inetd.conf来保证每个ftp连接日志都能够纪录下来下面是个修改inetd.conf例子假如有下行:
  
  ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
  
  注释:
  

  -l每个ftp连接都写到syslog
  
  -L纪录用户个命令
  
  -i文件received,纪录到xferlog
  
  -o文件transmitted,记录到xferlog
  
  不过你也不要太相信日志绝大部分黑客都有“擦脚印”“好”习惯啰!如果你不放心最好安装个Snfer吧
  
  有关TCP_WRAPPERS
  
  默认Redhat Linux允许所有请求这是很危险如果用TCP_WRAPPERS来增强我们站点安全性简直是举手的劳你可以将禁止所有请求放入“ALL: ALL”到/etc/hosts.deny中然后放那些明确允许请求到/etc/hosts.allow中如:
  
  sshd: 192.168.1.10/255.255.255.0 gate.openarch.com
  
  对IP地址192.168.1.10和主机名gate.openarch.com允许通过ssh连接配置完了的后用tcpdchk检查你可以直接执行:tcpdchk 在这里tcpchk是TCP_Wrapper配置检查工具它检查你tcp wrapper配置并报告所有发现潜在/存在问题
  
  有关补丁
  
  你应该经常到你所安装Linux系统发行商主页上去找最新补丁例如:对于Redhat系统而言可以在:http://www.redhat.com/corp/support/errata/上找到补丁幸运在Redhat6.1以后版本带有个自动升级工具up2date它能自动够测定哪些rpm包需要升级然后自动从Redhat站点并完成安装这对某些懒惰管理员来说可是个省精神福音哦!^_^
Tags: 

延伸阅读

最新评论

发表评论