(2)选择要安装的文件(distributions): 只安装必要的基本系统即可,绝对不要安装全部软件。在custom项目中,选取如下安装内容: bin,基本的FreeBSD系统文件; man,系统帮助文件; src—》sys,操作系统核心源码,定制内核时候将使用到。 接下来,安装程序询问是否安装PORTS,为了方便安装软件,我们选择安装。但在高安全要求的系统上,最好不要使用ports或者packages,尽量自己下载源代码在本地编译,手动安装。 提示:有时,安全和易用是相互矛盾的。 然后是拷贝文件,直至安装完毕。 3.安装后的初步设置 安装完之后,建议您安装cvsup-without-gui(从bento.freebsd.org可以下在最新版本),并同步代码。对系统进行初步设置: 增加用户帐号; 设置网络参数,将主机连接到网络上(全部设置完成后移动到Internet); 配置网络服务,打开FTP、SSH服务,后续的配置工作都将远程进行。 二、定制系统内核 定制系统内核内容: 支持特定硬件,如SMP、RAID、大容量内存; 删除多余硬件驱动支持; 增强系统安全性,增加IP过滤防火墙支持。 编辑内核设置文件,为增强安全特性,增添或修改如下内容: #启用ipfw过滤 options IPFIREWALL #打开IPFW过滤功能 options IPFIREWALL_VERBOSE #设置过滤日志记录 options IPFIREWALL_VERBOSE_LIMIT=100 #设置日志记录限制 options IPFIREWALL_DEFAULT_TO_ACCEPT #设置缺省行为 options NOLKM#关闭LKM options TCP_DROP_SYNFIN #丢弃SYNFIN包,需要在rc.conf中打开 #关于虚拟终端 #取消历史记录,在登出系统后刷新虚拟终端缓冲中的内容 SC_NO_HISTORY #取消debug键 SC_DISABLE_DDBKEY #取消ctl+alt+del键 SC_DISABLE_REBOOT 重新编译系统内核并使之生效。 三、系统配置 1.修改/etc/inetd.conf文件内容,配置inetd服务 (1)telnet服务 我们将使用SSH远程管理这台服务器,因此禁止telnet服务:在行前加"#"标记。 (2)FTP服务 使用系统自带的FTP服务,并作如下设置: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -h -l 参数,记录每个成功或者失败的FTP登录尝试; -l -l 参数,所有的下载、上传、删除更动作和文件名都会被记录下来(设置syslog.conf) -h参数,将禁止主机相关信息的输出,例如ftpd版本、主机名等; -P参数,指定FTPD进程监听端口号 FTP服务其他安全方面的设置: 把网站编辑帐号放到/etc/ftpchroot文件中,把他们限制在自己的HOME目录,防止浏览其他目录。 编辑/etc/hosts.allow 文件,限制对FTPD的访问。 可以编辑/etc/ftpwelcome,防止泄露系统信息。 2.修改/etc/rc.conf文件,配置系统初始参数 #配置开机器后自动启动或关闭的守护进程 #可以关闭inetd,使用SSH代替了telnet服务,使用其他的FTP服务程序代替系统的ftpd。 inetd_enable="NO" #如果决定使用inetd则启动inetd的日志选项,并提高一个服务每分钟启动的上限数目(默认是256,建议提高到1024),防止DoS攻击; inetd_enable="YES" inetd_flags="-l -R 1024" #打开SSHD sshd_enable="YES" #禁止syslogd记录其他主机日志(关闭端口514) syslogd_enable="YES" syslogd_flags="-s -s" #关闭不必要的服务。本服务器没有NFS、NIS登需要,可以关闭portmap (关闭端口111) portmap_enable="NO" nfs_server_enable="NO" nfs_client_enable="NO" #使sendmail只监听localhost,允许邮件客户程序发送邮件 sendmail_enable="NO" #设置为"NONE",将彻底关闭25端口 #设置内核安全级别(Securelevels) #内核安全级别从-1到3,-1和0级别是非安全级别。 #系统在多用户模式下,安全级别只能提升不能降低。 #Securelevel -1,永久不安全模式 #Securelevel 0,不安全模式 #Securelevel 1,安全模式 #Securelevel 2,高安全模式 kern_securelevel_enable="YES" kern_securelevel="2" #计算机启动时候发现文件系统失效,将以-y参数运行fsck fsck_y_enable="YES" #打开磁盘配额 enable_quotas="YES" check_quotas="YES" #在系统启动时清空/tmp clear_tmp_enable="YES" #防止系统自动加入信息到motd update_motd="NO" #启动防火墙设置 firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/firewall.rules" #丢弃SYNFIN信息包。缺省时设置为”NO”,当设置为”YES”的时候,系统内核将忽略同时设置了syn和fin位的TCP桢(需要内核的支持:options tcp_drop_synfin) tcp_drop_synfin="YES" #丢弃ICMP重定向。可以防止DOS攻击或劫持进程(hijack sessions) icmp_drop_redirect="YES" icmp_log_redirect="YES" #记录ICMP重定向 #在CISCO路由器上关闭重定向:no ip send-redirects log_in_vain="YES" #记录每一个到关闭端口的连接企图。 aclearcase/" target="_blank" >ccounting_enable="YES" #打开系统审计功能 3.修改/etc/sysctl.conf文件,调整IP堆栈 #关闭对广播类型的响应,过滤ICMP响应后,服务器无法ping 通,可以提高部分安全性能 net.inet.icmp.bmcastecho=0 #对UDP包的校验和进行计算,防止不正确的UDP包的攻击 net.inet.udp.checksum=1 #在默认情况下,操作系统在关闭的端口上接受到TCP SYN段的时候,会发送RST信息包,告诉攻击者这个端口关闭了,导致攻击者继续扫描下一个端口,使端口扫描简单化,浪费了本机CPU时间在DOS上。我们可以使用blackhole来控制对没有socket监听的TCP或者UDP端口接受到连接请求时的行为。 #当设置这个选项后,系统将马上丢弃这个包而不发RST包,连接端将看到"Connection reset by peer." net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1 4.防火墙规则设置 尽管按照上面的叙述已经能够形成一定的防护,但是若要实现安全程度更高的主机系统,就要借助于IPFW这样的包过滤软件,通过设置防火墙规则,严格限制对服务器的访问。 过滤ICMP服务,命令格式: ipfw add pass log icmp from $ip to any [要处理的协议] icmp是使用类型规定出站的信息。 0 echo-reply ping 3 destination unreachable Any TCP/UDP traffic(主机不可到达) 5 redirect routing if not running routing daemon(如果未运行路由守护程序,复位向路由) 8 echo-request ping (入站信息) 11 time-exceeded traceroute (traceroute 超时) 配置文件的例子: ip="你自己的IP" #强制清除所有规则 ipfw -f flush ipfw add pass log udp from $ip to any ipfw add pass log icmp from $ip to any icmp 8#接受回答 ipfw add pass log icmp from not $ip to $ip icmp 0#拒绝请求 ipfw add pass log icmp from not $ip to any icmp 11# traceroute 超时 ipfw add pass log icmp from not $ip to any icmp 3#目标主机不可到达 #SYN、FIN组合的包一般是nmap、queso扫描器使用,所以过滤。 ipfw add deny log tcp from any to any in tcpflags syn,fin #检查通信状态 ipfw add check-state ipfw add deny tcp from any to any in established ipfw add allow ip from any to any out keep-state #允许ident请求 ipfw add allow tcp from any to any 113 keep-state setup 5.日志管理 (1)启动日志 修改/etc/rc.conf文件。使用 "-s -s"标志启动syslogd,防止打开UDP 514端口; (2)修改/etc/syslog.conf文件,配置syslogd #可以将本地日志记录到其他主机loghost上: *.*@loghost #为FTP增加日志条目: ftp.* /var/log/ftpd #相关命令:touch /var/log/ftpd #记录SSH连接记录 security.*;auth.info /var/log/security #记录连接到SSH的日志信息 auth.* /var/log/authlog #使ipfw能够用syslog记录 !ipfw *.* /var/log/ipfw.log (3)使用newsyslog压缩日志 newsyslog程序能够定时压缩日志文件并清除旧的文件是,freebsd默认安装的,它是从crontab启动的: #grep newsyslog /etc/crontab 0 * * * * root /usr/sbin/newsyslog 可以修改/etc/newsyslog.conf以符合你的需求。通常把文件属性从664变为640,不让一般用户查看系统记录。 /var/log/authlog root.wheel 640 7 100 * Z /var/log/ipfw.log root.wheel 640 3 100 * Z #这会在日志文件达到100K时将它压缩并编号,将mode改成640,chown成root.wheel,并删除旧的日志文件。 #相关操作: #cd /var/log #chmod g-w,o-r *;chmod a+r wtmp #把所有文件的组属性改为wheel的。 #防止一般用户读日志配置文件 #chmod 600 /etc/syslog.conf #chmod 600 /etc/newsyslog.conf 四、用户管理 1.限制登录条件 (1)把个人用户放到/etc/ftpchroot文件中,把他们限制在自己的HOME目录 (2)修改/etc/shells文件,增加不能用来登录的shell,如passwd或者nologin,赋予仅需要FTP功能的用户以/usr/bin/passwd的shell 阻止他们使用SHELL命令。 (3)拒绝直接以root身份登录: 在/etc/ttys文件中,将"secure"标记改为"insecure"标记,使系统在进入单用户模式时会要求root密码。但是这样以来也为恢复root密码制造了障碍——安全和易用再次形成了矛盾的两个对立面。 console none unknown off insecure (4)使用 tcp wrapper (/etc/hosts.allow)允许/拒绝访问特定的TCP服务。 tcp_wrappers 可以在访问者要求服务前先检查/etc/hosts.allow 文件中设定的规则,符合放行规则的才会去启动服务程序,可以达到有条件开放系统服务的目的。 在/etc/host.allow文件中,注释掉"ALL:ALL:allow",去掉其他无关服务访问,增加如下内容: sshd: localhost : allow sshd: friendlycomputer : allow sshd: all : deny 另外需要注意的是: 注意规则的先后顺序,因为tcp_wrappers的规则有first match 的特性,最好把放行的规则写在前面,然后在后面加一条全部禁止的规则; 为避免 DNS 欺骗,规则尽量使用IP表示; FreeBSD缺省的/etc/hosts.allow中第一条规则是 ALL : ALL : allow,自己的规则一定要放在他前面才有效。 (5)使用 allowuser/allowgroup SSH配置选项以允许特定的用户和组使用SSH连接。 (6)限制登录的用户、组以及登录地方,修改/etc/login.access。 (7)利用login.conf对用户的登录环境和资源许可进行设置。 FreeBSD系统使用/etc/login.conf中描述的数据将用户按照登录环境、强制性的资源限制以及记帐管理登分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中该用户的设置中。 每次修改login.conf后,都要进行更新登录数据库的操作: #cap_mkdb /etc/login.conf 由于登录类别保存在master.passwd文件中,通常在使用adduser添加用户的时候设置用户的登录类别,如果要进行修改,必须使用vipw来修改/etc/master.passwd文件中的5个域。 2.登录环境 (1)编辑/etc/motd文件,阻止计算机泄露系统信息 (2)删除版权信息 #touch /etc/COPYRIGHT (3)防止系统自动加入信息,修改/etc/rc.conf update_motd="NO" (4)修改登录提示,编辑/etc/gettytab,找到default:小节,他以下面的文字开头: :cb:ce:ck:lc 小心的修改r:之间的文字来适应自己的需要。 3.crontab的问题 建议 www、nobody、bind等用户不能使用crontab,建立/etc/cron/allow文件把需要使用的用户放进去,如: #echo root>/var/cron/allow #chmod 600 /var/cron/allow 如果不使用at命令,就关闭这个服务,在/etc/crontab文件中注释掉 # */5 * * * * root /usr/libexec/atrun 4.保护文件系统 (1)锁住文件系统 A.修改/etc/fstab文件,设置系统启动时自动挂接的文件系统,使用nosuid参数挂接/usr 或 /(目的是/sbin)文件系统,尤其是一般用户可以写入的文件系统,应单独划分分区: /home or /usr/home /tmp or /var/tmp /etc/fstab文件内容: /dev/sd0s1e /var/tmp ufs rw,nosuid 2 2 B.搜寻并去除不用的二进制文件的suid位,(尤其是uucp——setgid) C.使用chflags设置变量,例如,给日志文件设置sappnd,给系统二进制文件设置schg标志; #相关命令: #找出你所有的可写入目录, #find / -perm -0777 -type d -ls 找出那些程序是suid 或者sgid的命令: #find / -perm -2000 -ls #find / -perm -4000 –ls (2)文件保护,严格限制系统配置文件权限,只对root用户开放读写权利: #chflags schg /bin/* #chflags schg /sbin/* #chmod 600 /etc/firewall.rules #chmod 600 /etc/crontab #chmod 600 /etc/newsyslog.conf #chmod 600 /etc/rc.sysctl #chmod 600 /etc/rc.conf #chmod 600 /etc/syslog.conf #chmod 600 /etc/sysctl.conf #防止一般用户读日志文件 # chmod 640 /var/log/httpd-access.log (3)可以把不是很有用的程序 chmod 000,如uustat,uucico。如果你从来不碰uucp或是PPP和PPPD的话,你绝不会用到他们。如果不用打印机的话,把lpr lprd也chmod 000了吧。 5.其他相关 修改计算机相关设置,如BIOS,不允许软盘启动、CDROM启动,即在装载硬盘驱动之前不允许其他媒介启动,设置BIOS密码,保护机器物理安全。 五、配置SSH 修改/etc/ssh/ssh_config文件 (1)使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻击者通过修改携带的版本banner来劫持(hijacking)启动会话进程并降低到protocol 1。注释掉protocol 2,1 改用下面语句代替: protocol 2 (2)合理设置最大连接数量, 防止DOS攻击 MaxStartups 5:50:10 (3)禁止远程root和空密码登录,建议关闭X11forwording X11Forwarding no (4)强烈建议不使用静态密码,而使用DSA 或RSA KEY,修改如下内容可以关闭使用密码认证: PasswordAuthentication no (5)可以限制组或光是单个用户访问shell AllowGroups wheel AllowUsers xundi (6)使用TCP wrappers来限制一些访问,修改/etc/hosts.allow文件,注释掉"ALL : ALL : allow",增加如下内容: sshd:localhost:allow sshd:friendlcomputer:allow sshd:all : deny #相关命令: #chsh -s /sbin/nologin user 六、总结和补充 使用最新版本的操作系统;推荐使用STABLE或者最新RELEASE分支。 修改系统前,首先备份系统。 修改/etc/inetd.conf和rc.conf关闭可有可无和不必要的服务。 立即禁用telnet,使用SSH代替之——OpenSSH在freebsd安装时即被包括。 使用SSH2协议中内建的sftp服务代替标准的ftp 建立SSH公钥防止口令传输。 使用包过滤软件类如ipfw或者ipfilter限制服务的获取。 禁止不需要的帐户 应用组和用户的概念 设置正确的文件权限 以chroot环境运行具有潜在危险的程序,例如bind 使用sudo,非严格root级访问 限制某些强大命令的访问 如何检查你的安全性 /usr/ports/security/nmap 对自己进行端口扫描,以发现异常服务 /usr/ports/security/whisker 对WEB服务器进行审计,防止潜在破坏 /usr/ports/security/tripwire- /usr/ports/security/snort 日常操作 (1)经常查看http://www.freebsd.org/security/index.html的安全公告; (2)订阅security bugtraq和freebsd官方安全邮件列表了解安全动态; (3)每天查看系统日志,关于检查系统日志,你可以通过其他工具增加多信息的捕获,如snort可以比较完全的记录信息; (4)如果你的硬盘够大,信息处理够快,可以定时使用 netstat -an >> /.../.../netstat.log来记录信息,因为netstat能记录连接信息,所以如有些后门日志不能记录,但netstat却在一定时间里总有连接记录。 (5)如果你对文件系统有原始的记录,可以定时使用一些系统完整性检查工具进行检验; (6)如果你有防火墙,经常查看防火墙信息。