Linux服务器安全优化及配置

众所周知,网络安全是一个非常重要的课题,而服务器是网络安全中最关键的环节。Linux被认为是一个比较安全的Internet服务器,作为一种开放源代码操作系统,一旦Linux系统中发现有安全漏洞,Internet上来自世界各地的志愿者会踊跃修补它。然而,系统管理员往往不能及时地得到信息并进行更正,这就给黑客以可乘之机。相对于这些系统本身的安全漏洞,更多的安全问题是由不当的配置造成的,可以通过适当的配置来防止。服务器上运行的服务越多,不当的配置出现的机会也就越多,出现安全问题的可能性就越大。对此,下面将介绍一些增强Linux/Unix服务器系统安全性的知识。

一、系统安全记录文件
 操作系统内部的记录文件是检测是否有网络入侵的重要线索。如果您的系统是直接连到Internet,您发现有很多人对您的系统做Telnet/FTP登录尝试,可以运行"#more /var/log/secure | grep refused"来检查系统所受到的攻击,以便采取相应的对策,如使用SSH来替换Telnet/rlogin等。

二、启动和登录安全性
  1.BIOS安全
  设置BIOS密码且修改引导次序禁止从软盘启动系统。
  2.用户口令
 用户口令是Linux安全的一个基本起点,很多人使用的用户口令过于简单,这等于给侵入者敞开了大门,虽然从理论上说,只要有足够的时间和资源可以利用,就没有不能破解的用户口令,但选取得当的口令是难于破解的。较好的用户口令是那些只有他自己容易记得并理解的一串字符,并且绝对不要在任何地方写出来。
  3.默认账号
 应该禁止所有默认的被操作系统本身启动的并且不必要的账号,当您第一次安装系统时就应该这么做,Linux提供了很多默认账号,而账号越多,系统就越容易受到攻击。
  可以用下面的命令删除账号。
  # userdel用户名
  或者用以下的命令删除组用户账号。
  # groupdel username
  4.口令文件
  chattr命令给下面的文件加上不可更改属性,从而防止非授权用户获得权限。
  # chattr +i /etc/passwd
  # chattr +i /etc/shadow
  # chattr +i /etc/group
  # chattr +i /etc/gshadow
  5.禁止Ctrl+Alt+Delete重新启动机器命令
  修改/etc/inittab文件,将"ca::ctrlaltdel:/sbin/shutdown -t3 -r now"一行注释掉。然后重新设置/etc/rc.d/init.d/目录下所有文件的许可权限,运行如下命令:
  # chmod -R 700 /etc/rc.d/init.d/*
  这样便仅有root可以读、写或执行上述所有脚本文件。
  6.限制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
  7.删减登录信息
 默认情况下,登录提示信息包括Linux发行版、内核版本名和服务器主机名等。对于一台安全性要求较高的机器来说这样泄漏了过多的信息。可以编辑/etc/rc.d/rc.local将输出系统信息的如下行注释掉。
  # This will overwrite /etc/issue at every boot. So, make any changes you
  # want to make to /etc/issue here or you will lose them when you reboot.
  # echo “” > /etc/issue
  # echo “$R” >> /etc/issue
  # echo “Kernel $(uname -r) on $a $(uname -m)” >> /etc/issue
  # cp -f /etc/issue /etc/issue.net
  # echo >> /etc/issue
  然后,进行如下操作:
  # rm -f /etc/issue
  # rm -f /etc/issue.net
  # touch /etc/issue
  # touch /etc/issue.net

三、限制网络访问
  1.NFS访问
 如果你使用NFS网络文件系统服务,应该确保您的/etc/exports具有最严格的访问权限设置,也就是意味着不要使用任何通配符、不允许root写权限并且只能安装为只读文件系统。编辑文件/etc/exports并加入如下两行。
  /dir/to/export host1.mydomain.com(ro,root_squash)
  /dir/to/export host2.mydomain.com(ro,root_squash)
  /dir/to/export 是您想输出的目录,host.mydomain.com是登录这个目录的机器名,ro意味着mount成只读系统,root_squash禁止root写入该目录。为了使改动生效,运行如下命令。
  # /usr/sbin/exportfs -a
  2.Inetd设置
 首先要确认/etc/inetd.conf的所有者是root,且文件权限设置为600。设置完成后,可以使用"stat"命令进行检查。
  # chmod 600 /etc/inetd.conf
  然后,编辑/etc/inetd.conf禁止以下服务。
  ftp telnet shell login exec talk ntalk imap pop-2 pop-3 finger auth
 如果您安装了ssh/scp,也可以禁止掉Telnet/FTP。为了使改变生效,运行如下命令:
  #killall -HUP inetd
 默认情况下,多数Linux系统允许所有的请求,而用TCP_WRAPPERS增强系统安全性是举手之劳,您可以修改/etc/hosts.deny和/etc/hosts.allow来增加访问限制。例如,将/etc/hosts.deny设为"ALL: ALL"可以默认拒绝所有访问。然后在/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配置并报告所有发现的潜在/存在的问题。
  3.登录终端设置
  /etc/securetty文件指定了允许root登录的tty设备,由/bin/login程序读取,其格式是一个被允许的名字列表,您可以编辑/etc/securetty且注释掉如下的行。
  #tty1
  # tty2
  # tty3
  # tty4
  # tty5
  # tty6
  这时,root仅可在tty1终端登录。
  4.避免显示系统和版本信息。
 如果您希望远程登录用户看不到系统和版本信息,可以通过一下操作改变/etc/inetd.conf文件:
  telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
  加-h表示telnet不显示系统信息,而仅仅显示"login:”

四、防止攻击
  1.阻止ping 如果没人能ping通您的系统,安全性自然增加了。为此,可以在/etc/rc.d/rc.local文件中增加如下一行:
  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  2.防止IP欺骗
  编辑host.conf文件并增加如下几行来防止IP欺骗攻击。
  order bind,hosts
  multi off
  nospoof on
  3.防止DoS攻击
 对系统所有的用户设置资源限制可以防止DoS类型攻击。如最大进程数和内存使用数量等。例如,可以在/etc/security/limits.conf中添加如下几行:
  * hard core 0
  * hard rss 5000
  * hard nproc 20
  然后必须编辑/etc/pam.d/login文件检查下面一行是否存在。
  session required /lib/security/pam_limits.so
 上面的命令禁止调试文件,限制进程数为50并且限制内存使用为5MB。

8.阻止任何人su作为root

如果你不想任何人能够su作为root,你能编辑/etc/pam.d/su加下面的行:

#vi /etc/pam.d/su  
auth sufficient /lib/security/$ISA/pam_rootok.so debug  
auth required /lib/security/$ISA/pam_wheel.so group=website  
意味着仅仅website组的用户可以su作为root.  

10.修改ssh服务的sshd 端口

ssh默认会监听在22端口,你可以修改至6022端口以避过常规的扫描。
注意:修改端口错误可能会导致你下次连不到服务器,可以先同时开着22和6022两个端口,然后再关掉22端口;
重启sshd不会弹掉你当前的连接,可以另外开一个客户端来测试服务;

#vi /etc/ssh/sshd_config  
#增加修改  
#Port 22 #关闭22端口  
Port 6022 #增加6022端口  
#重启sshd服务  
service sshd restart  
检查一下sshd的监听端口对不对  
netstat -lnp|grep ssh  
#iptables开放sshd的6022端口  
vi /etc/sysconfig/iptables  
#如果使用redhat默认规则则增加  
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6022 -j ACCEPT  
#或  
iptables -A INPUT -p tcp --dport 6022 -j ACCEPT  
iptables -A OUTPUT -p udp --sport 6022 -j ACCEPT  

重启iptables 服务

service iptables restart  
#测试两个端口是否都能连上,连上后再将22端口删除  

详细参考:
Linux操作系统下SSH默认22端口修改方法

经过以上的设置,你的Linux服务器已经可以对绝大多数已知的安全问题和网络攻击具有免疫能力,但一名优秀的系统管理员仍然要时刻注意网络安全动态,随时对已经暴露出的和潜在安全漏洞进行修补。

11.关闭系统不使用的服务:

cd /etc/init.d #进入到系统init进程启动目录
在这里有两个方法,可以关闭init目录下的服务,

一、将init目录下的文件名mv成*.old类的文件名,即修改文件名,作用就是在系统启动的时候找不到这个服务的启动文件。

二、使用chkconfig系统命令来关闭系统启动等级的服务。

注:在使用以下任何一种方法时,请先检查需要关闭的服务是否是本服务器特别需要启动支持的服务,以防关闭正常使用的服务。

使用chkcofig命令来关闭不使用的系统服务 (level前面为2个减号)要想在修改启动脚本前了解有多少服务正在运行,输入:

ps aux | wc -l  

然后修改启动脚本后,重启系统,再次输入上面的命令,就可计算出减少了多少项服务。越少服务在运行,安全性就越好。另外运行以下命令可以了解还有多少服务在运行:

netstat -na --ip  

批量方式先停止服务

for i in acpid anacron apmd atd auditd autofs avahi-daemon avahi-dnsconfd bluetooth cpuspeed cups dhcpd firstboot gpm haldaemon hidd ip6tables ipsec isdn kudzu lpd mcstrans messagebus microcode_ctl netfs nfs nfslock nscd pcscd portmap readahead_early restorecond rpcgssd rpcidmapd rstatd sendmai
l setroubleshoot snmpd sysstat xfs xinetd yppasswdd ypserv yum-updatesd ;do service $i stop;done

关闭启动服务

for i in acpid anacron apmd atd auditd autofs avahi-daemon avahi-dnsconfd bluetooth cpuspeed cups dhcpd firstboot gpm haldaemon hidd ip6tables ipsec isdn kudzu lpd mcstrans messagebus microcode_ctl netfs nfs nfslock nscd pcscd portmap readahead_early restorecond rpcgssd rpcidmapd rstatd sendmai
l setroubleshoot snmpd sysstat xfs xinetd yppasswdd ypserv yum-updatesd ;do chkconfig $i off;done

以下为手动方式及解释,执行批量方式后不需再执行了

chkconfig --level 345 apmd off ##笔记本需要  
chkconfig --level 345 netfs off ## nfs客户端  
chkconfig --level 345 yppasswdd off ## NIS服务器,此服务漏洞很多  
chkconfig --level 345 ypserv off ## NIS服务器,此服务漏洞很多  
chkconfig --level 345 dhcpd off ## dhcp服务  
chkconfig --level 345 portmap off ##运行rpc(111端口)服务必需  
chkconfig --level 345 lpd off ##打印服务  
chkconfig --level 345 nfs off ## NFS服务器,漏洞极多  
chkconfig --level 345 sendmail off ##邮件服务, 漏洞极多  
chkconfig --level 345 snmpd off ## SNMP,远程用户能从中获得许多系统信息  
chkconfig --level 345 rstatd off ##避免运行r服务,远程用户可以从中获取很多信息  
chkconfig --level 345 atd off ##和cron很相似的定时运行程序的服务  
注:以上chkcofig 命令中的3和5是系统启动的类型,以下为数字代表意思  
0:开机(请不要切换到此等级)  
1:单人使用者模式的文字界面  
2:多人使用者模式的文字界面,不具有网络档案系统(NFS)功能  
3:多人使用者模式的文字界面,具有网络档案系统(NFS)功能  
4:某些发行版的linux使用此等级进入x windows system  
5:某些发行版的linux使用此等级进入x windows system  
6:重新启动  

如果不指定–level 单用on和off开关,系统默认只对运行级3,4,5有效

chkconfig cups off #打印机  
chkconfig bluetooth off # 蓝牙  
chkconfig hidd off # 蓝牙  
chkconfig ip6tables off # ipv6  
chkconfig ipsec off # vpn  
chkconfig auditd off #用户空间监控程序  
chkconfig autofs off #光盘软盘硬盘等自动加载服务  
chkconfig avahi-daemon off #主要用于Zero Configuration Networking ,一般没什么用建议关闭  
chkconfig avahi-dnsconfd off #主要用于Zero Configuration Networking ,同上,建议关闭  
chkconfig cpuspeed off #动态调整CPU频率的进程,在服务器系统中这个进程建议关闭  
chkconfig isdn off #isdn  
chkconfig kudzu off #硬件自动监测服务  
chkconfig nfslock off #NFS文档锁定功能。文档共享支持,无需的能够关了  
chkconfig nscd off #负责密码和组的查询,在有NIS服务时需要  
chkconfig pcscd off #智能卡支持,,如果没有可以关了  
chkconfig yum-updatesd off #yum更新  
chkconfig acpid off  
chkconfig autofs off  
chkconfig firstboot off  
chkconfig mcstrans off #selinux  
chkconfig microcode_ctl off  
chkconfig rpcgssd off  
chkconfig rpcidmapd off  
chkconfig setroubleshoot off  
chkconfig xfs off  
chkconfig xinetd off  
chkconfig messagebus off  
chkconfig gpm off #鼠标  
chkconfig restorecond off #selinux  
chkconfig haldaemon off  
chkconfig sysstat off  
chkconfig readahead_early off  
chkconfig anacron off  

需要保留的服务

crond , irqbalance , microcode_ctl ,network , sshd ,syslog  

因为有些服务已运行,所以设置完后需重启

chkconfig  
/*  

语法:chkconfig [–add][–del][–list][系统服务] 或 chkconfig [–level <等级代号>][系统服务][on/off/reset]

补充说明:这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。
参数:

--add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。  
--del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。  
--level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关毕  
/  

12.阻止系统响应任何从外部/内部来的ping请求

既然没有人能ping通你的机器并收到响应,你可以大大增强你的站点的安全性。你可以加下面的一行命令到/etc/rc.d/rc.local,以使每次启动后自动运行。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all  
#这个可以不做哈  

13.修改“/etc/host.conf”文件

“/etc/host.conf”说明了如何解析地址。编辑“/etc/host.conf”文件(vi /etc/host.conf),加入下面这行:  
# Lookup names via DNS first then fall back to /etc/hosts.  
order hosts,bind  
# We have machines with multiple IP addresses.  
multi on  
# Check for IP address spoofing.  
nospoof on  

第一项设置首先通过DNS解析IP地址,然后通过hosts文件解析。第二项设置检测是否“/etc/hosts”文件中的主机是否拥有多个IP地址(比如有多个以太口网卡)。第三项设置说明要注意对本机未经许可的电子欺骗。

14.不允许从不同的控制台进行root登陆

“/etc/securetty"文件允许你定义root用户可以从那个TTY设备登陆。你可以编辑”/etc/securetty"文件,再不需要登陆的TTY设备前添加“#”标志,来禁止从该TTY设备进行root登陆。

在/etc/inittab文件中有如下一段话:

# Run gettys in standard runlevels  
1:2345:respawn:/sbin/mingetty tty1  
2:2345:respawn:/sbin/mingetty tty2  
#3:2345:respawn:/sbin/mingetty tty3  
#4:2345:respawn:/sbin/mingetty tty4  
#5:2345:respawn:/sbin/mingetty tty5  
#6:2345:respawn:/sbin/mingetty tty6  

系统默认的可以使用6个控制台,即Alt+F1,Alt+F2…,这里在3,4,5,6前面加上“#”,注释该句话,这样现在只有两个控制台可供使用,最好保留两个。然后重新启动init进程,改动即可生效!

15.禁止Control-Alt-Delete键盘关闭命令

查看文本打印

"/etc/inittab" 文件中注释掉下面这行(使用#):  
ca::ctrlaltdel:/sbin/shutdown -t3 -r now  
改为:  
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now  
为了使这项改动起作用,输入下面这个命令:  
# /sbin/init q  

16.用chattr命令给下面的文件加上不可更改属性。

[root@c1gstudio]# chattr +i /etc/passwd  
[root@c1gstudio]# chattr +i /etc/shadow  
[root@c1gstudio]# chattr +i /etc/group  
[root@c1gstudio]# chattr +i /etc/gshadow  

【注:chattr是改变文件属性的命令,参数i代表不得任意更动文件或目录,此处的i为不可修改位(immutable)。查看方法:lsattr /etc/passwd,撤销为chattr –i /etc/group】

补充说明:这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

a:让文件或目录仅供附加用途。  
b:不更新文件或目录的最后存取时间。  
c:将文件或目录压缩后存放。  
d:将文件或目录排除在倾倒操作之外。  
i:不得任意更动文件或目录。  
s:保密性删除文件或目录。  
S:即时更新文件或目录。  
u:预防以外删除。  

参数:

-R 递归处理,将指定目录下的所有文件及子目录一并处理。  
-v<版本编号> 设置文件或目录版本。  
-V 显示指令执行过程。  
+<属性> 开启文件或目录的该项属性。  
-<属性> 关闭文件或目录的该项属性。  
=<属性> 指定文件或目录的该项属性。  

17.给系统服务端口列表文件加锁

主要作用:防止未经许可的删除或添加服务

chattr +i /etc/services  
【查看方法:lsattr /etc/ services,撤销为chattr –i /etc/ services】  

18.系统文件权限修改

Linux文件系统的安全主要是通过设置文件的权限来实现的。每一个Linux的文件或目录,都有3组属性,分别定义文件或目录的所有者,用户组和其他人的使用权限(只读、可写、可执行、允许SUID、允许SGID等)。特别注意,权限为SUID和SGID的可执行文件,在程序运行过程中,会给进程赋予所有者的权限,如果被黑客发现并利用就会给系统造成危害。

(1)修改init目录文件执行权限:

chmod -R 700 /etc/init.d/* (递归处理,owner具有rwx,group无,others无)

(2)修改部分系统文件的SUID和SGID的权限:

chmod a-s /usr/bin/chage  
chmod a-s /usr/bin/gpasswd  
chmod a-s /usr/bin/wall  
chmod a-s /usr/bin/chfn  
chmod a-s /usr/bin/chsh  
chmod a-s /usr/bin/newgrp  
chmod a-s /usr/bin/write  
chmod a-s /usr/sbin/usernetctl  
chmod a-s /usr/sbin/traceroute  
chmod a-s /bin/mount  
chmod a-s /bin/umount  
chmod a-s /sbin/netreport  

(3)修改系统引导文件

chmod 600 /etc/grub.conf  
chattr +i /etc/grub.conf  
【查看方法:lsattr /etc/grub.conf,撤销为chattr –i /etc/grub.conf】  

19.增加dns

#vi /etc/resolv.conf  
nameserver 8.8.8.8 #google dns  
nameserver 8.8.4.4  

20.hostname 修改

#注意需先把mysql、postfix等服务停了  
1.hostname servername  
2.vi /etc/sysconfig/network  
service network restart  
3.vi /etc/hosts  

21.selinux 修改

开启selinux可以增加安全性,但装软件时可能会遇到一些奇怪问题
以下是关闭方法

查看文本打印

#vi /etc/selinux/config  

改成disabled

22.关闭ipv6

echo "alias net-pf-10 off" >> /etc/modprobe.conf  
echo "alias ipv6 off" >> /etc/modprobe.conf  
#vi /etc/sysconfig/network  
NETWORKING_IPV6=no  

重启服务

Service ip6tables stop  
Service network restart  

关闭自动启动

chkconfig --level 235 ip6tables off  

23.设置iptables

iptables 默认安全规则脚本

重启系统

以上大部分设置可以运行脚本来完成。linux安全设置快捷脚本

设置完成后重启系统

其它设置项

linux调整系统时区/时间的方法

把/usr/share/zoneinfo里相应的时区与/etc/localtime做个软link.比如使用上海时区的时间:ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 如果要使用UTC计时方式,则应在/etc/sysconfig/clock文件里改UTC=TRUE 时间的设置: 使用date 命令加s参数修改,注意linux的时间格式为"月日时分年",也可以只修改时间date -s 22:30:20,如果修改的是年月日和时间,格式为"月日时分年.秒",2007-03-18 11:01:56则应写为"date -s 031811012007.56 硬件时间与当前时间更新: hwclock --systohc 如果硬件记时用UTC,则为 hwclock --systohc --utc

linux调整系统时区/时间的方法

  1. 找到相应的时区文件
/usr/share/zoneinfo/Asia/Shanghai  

用这个文件替换当前的/etc/localtime文件。
步骤: cp –i /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

选择覆盖

  1. 修改/etc/sysconfig/clock文件,修改为:
ZONE="Asia/Shanghai"  
UTC=false  
ARC=false  

3)时间设定成2005年8月30日的命令如下:

#date -s 08/30/2005  

将系统时间设定成下午6点40分0秒的命令如下:

#date -s 18:40:00  

4)同步BIOS时钟,强制把系统时间写入CMOS,命令如下:

#clock -w  

安装ntpd

#yum install ntp  
#chkconfig --levels 235 ntpd on  
#ntpdate ntp.api.bz #先手动校准下  
#service ntpd start  

设置语言

英文语言,中文支持

#vi /etc/sysconfig/i18n  
LANG="en_US.UTF-8"  
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"  
SYSFONT="latarcyrheb-sun16"  

tmpwatch 定时清除

假设服务器自定义了php的session和upload目录

#vi /etc/cron.daily/tmpwatch  
在240 /tmp 前增加  
-x /tmp/session -x /tmp/upload  
#mkdir /tmp/session  
#mkdir /tmp/upload  
#chown nobody:nobody /tmp/upload  
#chmod 0770 /tmp/upload  
发布了75 篇原创文章 · 获赞 96 · 访问量 6396

猜你喜欢

转载自blog.csdn.net/weixin_45762569/article/details/102921999