unix&linux系列一:Host&Security by irunnet.com



一、系统和服务程序的安装
1.
系统安装
2.
服务程序安装

二、系统安全设置
1.
用户控制
2.
文件访问控制
3.
系统服务和端口控制
4.
日志管理和控制
5.
文件指纹检测
6.
系统指纹泄露和防范
7.
系统内核安全
8.
系统安全优化



一、系统和服务程序的安装


1.
系统安装

系统文件拷贝完以后,会要求配置一些设置,比如把 IP 地址、名字服务器等设好,不要打开 IPv6 ,不需要 DHCP 等服务,不要系统默认的 FTP 服务,配置 /etc/inetd.conf 时把 SSH 服务打开,方便我们进行远程管理,如果不想使用 inetd 这个超级服务来管理的话,可以关闭它,在 /etc/rc.conf 中添加 inetd_enable="NO" ,然后设置 sshd_enable="YES" 一样可以打开 SSH 服务,后面我们会详细谈到 SSH 的设置。

系统装完后,在 /etc/inetd.conf 中把除了 ssh 之外的服务全部关闭,特别是 telnet rlogin 等服务,一定要慎重,否则很可能每几天系统就被入侵了。安装完系统后,建议对系统进行升级,比如使用 make world cvsup 把系统内核和 ports 进行升级。这个步骤和 Windows 装完后打补丁差不多。


2.
服务程序安装

系统装完以后,就开始安装我们的应用软件,我们的方针还是最新的软件是最安全的,比如能够防止一些老版本中的溢出等等。我们基本就是要让我们的系统有数据库,同时能够处理 Web 服务,同时能够远程对网站进行文件管理的 FTP 服务。我们基本选择的程序都是比较通常的程序。另外,为了有个可视化的管理工具,我们同时也可以安装一个基于浏览器的管理工具 Webmin ,方便没有 ssh 客户端等等的时候进行管理。

首先我们选用的 Web 服务是 Apache httpd 2.0.55 网站是 PHP 程序编写,所以要安装 PHP ,版本是 4.4.1 ,也是最新的版本,如果你的网站程序需要 PHP5 的支持,那么可以下载 php5.0.4 。数据库还是最快速的 Mysql ,选择的版本是 4.1.15 ,如果你需要外键、事务、子查询、存储过程等的支持,那么你可以考虑 4.1 5.0 的版本。最后我们的 FTP 选择最安全的 vsFTPd ,因为它是最安全快速的,我在局域网中测试它的最高创数速率能够达到 10MB/S,proFTPd 只有 8MB/S vsFTPd 针对小型 FTP 服务器支持非常好,毕竟我用户不多,几个更新网站而已,当然,如果你喜欢简单方便,也可以考虑使用 FreeBSD 自带的 FTPd ,功能和易用性也是不错的。如果你用户比较多,并且功能要求比较高,建议使用 proFTPd pure-FTPd wu-FTPd 等,但有些 FTPd 不是非常安全,选择时候一定要慎重考虑。

服务器程序列表:
Apache 2.0.55
下载地址: http://httpd.apache.org
PHP 4.41
下载地址: http://www.php.net
Mysql 4.1.15
下载地址: http://dev.mysql.com
vsFTPd 2.0.2
下载地址: http://vsftpd.beasts.org

反正最少的服务 + 最少的端口 + 安全的设置 = 最大的安全,尽量能够不需要使用的服务就不要安装,比如 telnetd rlogind 等,那么相反会对服务器安全构成威胁。




二、系统安全设置


1.
用户控制

尽量少的用户,我们的 FTP 帐户是和系统帐户绑定在一起的,所以我们添加用户的时候先建立一个目录,然后把新建的用户主目录指向到该目录下。假设我需要一个用户能够管理我的网站,而我网站的目录是在 /usr/www 目录下,那么我们新建立的用户 www_user 的主目录就指向 /usr/www 目录,同时它的 shell 是没有的: /usr/sbin/nologin ,主要是为了防止它通过 ssh 登陆到系统。同时 FTP 的密码也要设置的非常复杂,防止黑客通过暴力破解获得 FTP 权限。另外还要说道我们的 root 用户的密码,我想最少应该不要少于 10 位的数字+字母+字符的密码(我的密码是 18 位),否则是非常不安全的,如果密码简单,那么黑客通过短时间的暴力破解 SSH 中的 root 帐户,不用几天,系统就可能被攻破了,同时也建议最少一个月更改一次 root 用户的密码。(强烈建议一般帐户不要有登陆系统的权限,就是把 shell 设为 /usr/sbin/nologin
一般如果要使用 root 权限建议建立一个属于 wheel 组的小用户,然后登陆后通过 su 命令提升为 root 用户进行管理,如果黑客通过破解了我们普通用户的权限后登陆系统,也不能直接通过 root 权限进行管理,这是一种安全防范的简单方法。


2.
文件访问控制

有时候被黑客入侵后拿到了小权限用户,比如传了一个 WebShell 到系统中,那么对方很可能会把 /etc/passwd 等内容直接读取出来,同时查看 /etc/master.passwd 中对加密后的 root 用户的密码 hash 进行破解,最后拿到密码进行登陆系统。那么我们就要控制部分文件只有 root 能够访问,其他用户无权访问。比如 uname gcc 等,如果黑客拿到小权限用户后就会查看系统版本,然后找到该版本系统对应的溢出程序,使用 gcc 来进行编译,如果我们能够限制黑客访问 uname gcc 等程序,能在一定程度上减缓黑客入侵的脚步。
使用 chmod 来改变某个文件的权限信息,比如我要 /etc/passwd /etc/master.passwd 文件只能允许 root 访问:
使用八进制数字来设置
# chmod 700 /etc/passwd
# chmod 700 /etc/master.passwd
使用字符标记来进行设置
# chmod u+w+r+x,go-w-r-x /etc/passwd
# chmod u+w+r+x,go-w-r-x /etc/master.passwd
系统中有多个重要文件需要设置控制访问权限,一定要控制好,否则将会构成重要威胁。


3.
系统服务和端口控制

端口开的越多就越给黑客多一个入侵的机会,服务越多,危险越大,因为你不知道那些服务是不是有潜在的漏洞或者又发现了新的漏洞,所以尽量少的服务,比如 sendmail 默认是打开的,那么些建议你把 sendmail 关闭,关闭防范是在 /etc/rc.conf 中加上:
sendmail_enable = "NONE"
,如果设为 "NO" 那么只能够关闭掉 pop3 服务,不能关闭 smtp 的服务,所以要设置为 "NONE"
系统中最好除了我们能够看到的 Apache Mysql vsFTPd SSH 之外不要打开其他任何端口和服务。基本的方式是使用 netstat -a 查看打开的端口,然后从对应的端口来找相关的服务,比如我们这里应该只允许开的端口有 21, 22, 80, 3306 等,如果有其他端口,那么一定要仔细检查,很可能是黑客的后门或者是会对系统安全构成威胁的服务。同时有些服务不需要监听网络连接的话,只是需要本地的连接,比如 Mysql ,那么就可以关闭 Socket 监听,这个将在 Mysql 安全设置中讲解,另外,可以通过防火墙来控制部分端口访问和连接状况,比如 Mysql 3306 端口只允许 192.168.0.1 访问,那么我们就在 ipfw 里添加规则:
ipfw add 10001 allow tcp from 192.168.0.1 to 10.10.10.1 80 in
这样就能够防止黑客来访问服务器上的 Mysql 服务。具体防火墙的设置将在下面 防火墙设置 中详细讲解。


4.
日志管理和控制


5.
文件指纹检测

文件指纹就是我们文件的基本信息,比如文件权限、文件所属用户 / 组、文件最后修改日期、文件大小等等,这些都是重要信息,一般黑客入侵后都可能修改文件,那么文件指纹就不一样了。另外,文件的 md5 校验值也属于文件的指纹的一种。
为了防止黑客篡改系统中的部分核心文件,比如 /etc/passwd, /etc/shadow, /etc/inetd.conf 等等,那么我们就可以考虑把部分重要文件进行备份,同时做一份目前有的文件的一个指纹保留,比如把 /etc /bin, /usr/bin 目录下的文件进行指纹保留:
# ls -l /etc > /var/back/etc.txt
# ls -l /bin > /var/back/bin.txt
# ls -l /bin > /var/back/usrbin.txt
当然,还有就是给每个重要的文件加上 md5 校验值,如果觉得不对劲的时候就进行匹配,保证文件的安全。
你可以给你觉得需要做指纹备份的目录进行备份,一般这是为了以后被黑客入侵后的系统检测和系统恢复。比如可以通过文件被修改的时间来确定是不是被入侵,比如可以对比看 /etc/inetc.conf 文件和备份的文件有什么不同来确定是不是安装了服务型后门等。


6.
系统指纹泄漏和防范  

一般黑客为了入侵某个系统,一定会先进行扫描等工作,扫描包括目标系统的端口开放情况和服务器使用服务程序和操作系统情况。比如很简单的手工检测 Web 服务的指纹:
# telnet target.com 80
那么就很可能返回 Apache PHP 的版本信息,那么同时也可能使用扫描工具对 Mysql vsFTPd SSH 等服务的端口进行扫描,获取这些服务的指纹。多暴露一份系统信息,那么系统就多一份危险。那么解决办法就是把服务器上服务程序的 Banner 全部修改掉,从而能够迷惑黑客。

下面简单的说一些修改那些服务 Banner 的方法。

* Apache
修改 httpd.conf 文件 , 设置以下选项 :
ServerSignature Off
ServerTokens Prod
上面的适用 apache1***, apache 2.0 这些都是默认 , 不过还是有 server=Apache 字样 , 若要完全去掉需重新編译。
彻底地去掉 banner, 修改 httpd.h:
Include/httpd.h
Define SERVER_BASEVENDOR "Apache Group"
Define SERVER_PRODUCTVENDOR "Apache"
Define SERVER_BASEVERSION "1.3.27"
后从新编译 Apache 就能够完全去掉了。


* PHP
php.ini 中设置 expose_php = Off ,那么将无法在 http 头信息中看到 php 的版本信息。

* Mysql


* vsFTPd
vsFTPd
基本上是无法获取到一些关于 vsFTPd banner 信息的,不过因为 vsFTPd 默认的 banner 信息是 "Welcome to FTP Server!" 对于高手来说,还是能够猜测到一点,所以我们要彻底改掉。修改 vsFTPd 的配置文件 vsftpd.conf 中的下面选项:
Ftpd_banner=xxxxx
把后面的 xxxxx 改为你想要的 banner 信息。


* SSH
好象 FreeBSD 下默认安装的 SSH telnet target.com 22 的时候会显示 SSH FreeBSD 的信息,简直是个大祸害,什么都告诉别人了,但是目前为止我还不知道怎么修改,知道的高手请指点。


7.
系统内核安全

FreeBSD
有个比较强的功能,就是能够定义系统内核的安全等级,主要是为了防止内核后门专门定制的,能通过不同的等级限制对内核的访问和对防火墙等的修改。我们首先要开启系统的安全等级,然后设定安全等级,我们打开 /etc/rc.conf
# ee /etc/rc.conf
加入下面的内容:
kern_securelevel_enable="YES"
kern_securelevel="-1"
第一句是打开安全等级,第二句是定义等级。它一共五个等级,下面说说不同之处。
* kern_securelevel -1
:这是系统默认级别,没有提供任何内核的保护错误;
* kern_securelevel  0
:基本上作用不多,当你的系统刚启动就是 0 级别的,当进入多用户模式的时候就自动变成 1 级了。
* kern_securelevel  1
:在这个级别上,有如下几个限制:
a.
不能通过 kldload 或者 kldunload 加载或者卸载可加载内核模块;
b.
应用程序不能通过 /dev/mem 或者 /dev/kmem 直接写内存;
c.
不能直接往已经装在 (mounted) 的磁盘写东西,也就是不能格式化磁盘,但是可以通过标准的内核接口执行写操作;
d.
不能启动 X-windows ,同时不能使用 chflags 来修改文件属性;
* kern_securelevel  2
:在 1 级别的基础上还不能写没装载的磁盘,而且不能在 1 秒之内制造多次警告,这个是防止 DoS 控制台的;
* kern_securelevel  3
:在 2 级别的级别上不允许修改 IPFW 防火墙的规则。
如果你已经装了防火墙,并且把规则设好了,不轻易改动,那么建议使用 3 级别,如果你没有装防火墙,而且还准备装防火墙的话,不建议使用。我们这里推荐使用 2 级别,能够避免比较多对内核攻击。


8.
系统安全优化

一般优化系统主要是重新编译内核,去掉一些不要的驱动等等,你可以参考我在我 Blog 上写的关于编译内核的文章。我们这里对网络和内核一些选项进行优化和安全设置。编辑 /etc/sysctl.conf 文件,在里面加入如下内容: ( 有注释 )

#
最大的待发送 TCP 数据缓冲区空间
net.inet.tcp.sendspace=65536

#
最大的接受 TCP 缓冲区空间
net.inet.tcp.recvspace=65536

#
最大的接受 UDP 缓冲区大小
net.inet.udp.sendspace=65535

#
最大的发送 UDP 数据缓冲区大小
net.inet.udp.maxdgram=65535

#
本地套接字连接的数据发送空间
net.local.stream.sendspace=65535

#
加快网络性能的协议
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1

#
最大的套接字缓冲区
kern.ipc.maxsockbuf=2097152

#
系统中允许的最多文件数量
kern.maxfiles=65536

#
每个进程能够同时打开的最大文件数量
kern.maxfilesperproc=32768

#
当一台计算机发起 TCP 连接请求时,系统会回应 ACK 应答数据包。该选项设置是否延迟 ACK 应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。
net.inet.tcp.delayed_ack=0

#
屏蔽 ICMP 重定向功能
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0

#
防止 ICMP 广播风暴
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0

#
限制系统发送 ICMP 速率
net.inet.icmp.icmplim=100

#
安全参数,编译内核的时候加了 options TCP_DROP_SYNFIN 才可以用
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1

#
设置为 1 会帮助系统清除没有正常断开的 TCP 连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的 TCP 连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开 modem 而不正确的关闭活动的连接
net.inet.tcp.always_keepalive=1

#
若看到 net.inet.ip.intr_queue_drops 这个在增加,就要调大 net.inet.ip.intr_queue_maxlen ,为 0 最好
net.inet.ip.intr_queue_maxlen=1000

#
防止 DOS 攻击,默认为 30000
net.inet.tcp.msl=7500

#
接收到一个已经关闭的端口发来的所有包,直接 drop ,如果设置为 1 则是只针对 TCP
net.inet.tcp.blackhole=2

#
接收到一个已经关闭的端口发来的所有 UDP 包直接 drop
net.inet.udp.blackhole=1

#
为网络数据连接时提供缓冲
net.inet.tcp.inflight.enable=1

#
如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和 arp 数据表,节约路由的计算时间 , 但会需要大量的内核内存空间来保存路由表
net.inet.ip.fastforwarding=0

#kernel
编译打开 options POLLING 功能,高负载情况下使用低负载不推荐 SMP 不能和 polling 一起用
#kern.polling.enable=1

#
并发连接数,默认为 128 ,推荐在 1024-4096 之间,数字越大占用内存也越大
kern.ipc.somaxconn=32768

#
禁止用户查看其他用户的进程
security.bsd.see_other_uids=0

#
设置 kernel 安全级别
kern.securelevel=0

#
记录下任何 TCP 连接
net.inet.tcp.log_in_vain=1

#
记录下任何 UDP 连接
net.inet.udp.log_in_vain=1

#
防止不正确的 udp 包的攻击
net.inet.udp.checksum=1

#
防止 DOS 攻击
net.inet.tcp.syncookies=1

#
仅为线程提供物理内存支持,需要 256 兆以上内存
kern.ipc.shm_use_phys=1

#
线程可使用的最大共享内存
kern.ipc.shmmax=67108864

#
最大线程数量
kern.ipc.shmall=32768

#
程序崩溃时不记录
kern.coredump=0

# lo
本地数据流接收和发送空间
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536

#
数据包数据段大小, ADSL 1452
net.inet.tcp.mssdflt=1460

#
为网络数据连接时提供缓冲
net.inet.tcp.inflight_enable=1

#
数据包数据段最小值, ADSL 1452
net.inet.tcp.minmss=1460

#
本地数据最大数量
net.inet.raw.maxdgram=65536

#
本地数据流接收空间
net.inet.raw.recvspace=65536

#ipfw
防火墙动态规则数量,默认为 4096 ,增大该值可以防止某些病毒发送大量 TCP 连接,导致不能建立正常连接
net.inet.ip.fw.dyn_max=65535

#
设置 ipf 防火墙 TCP 连接空闲保留时间,默认 8640000 120 小时)
net.inet.ipf.fr_tcpidletimeout=864000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值