内容简介:本文将详细介绍一个网站服务器的系统安装、针对安全因素的系统调整。该服务器通过Apache+PHP4+MySQL提供动态网站服务,通过自带的FTPD提供网页上传服务,通过自带的OpenSSH提供管理维护服务。本文将不涉及Apache和MySQL的管理。
" u4 n$ v2 v g# h2 j1 w+ @7 s 一、安装操作系统
- }+ p" Z. f7 J5 t
1.选择发行版本
1 V+ k! } u8 x' q
安装生产服务器,应当尽量选择最新的稳定版本。本文将采用FreeBSD 4.8 RELEASE。
5 j" r& V4 k; V9 F& h; q& N
4.8-RELEASE是成文时候最新的-STABLE版本。5.0-RELEASE和即将推出的5.1-RELEASE都是-CURRENT分支的发行版本,其稳定性和性能可能不如-STABLE,仅适合于开发者和发烧友。对于生产服务器来说,miniinst或disc1就足够了。请下载4.8-RELEASE-i386-mini.iso这个文件,刻录成安装光盘。
9 i8 G0 k( u% T9 p# A1 l& z0 C) A
本文所叙述操作系统的安装就将采用光盘安装方式。
0 Y- A& e9 \0 S0 k! z
2.安装要点
( H. _5 ~- U' \8 Z 通过安装向导可以很轻松的完成系统安装,这里不加详细叙述,仅仅指出如下两点:
: s5 m/ W9 t( m" N' Y
(1)硬盘分区的注意事项:
, r+ _+ ]' m: a% M3 a. K2 H g 分区的大小根据应用的实际情况而异,特别指出的是,网站文件、数据库文件、日志文件、临时文件应当单独分区存储,以防止攻击者滥用磁盘空间导致系统崩溃。下面是一块容量为18G SCSI硬盘的分区例子:
- X5 F \7 l- c2 L分区 大小 备注
* J6 S) I' v4 r5 o: ~ n, F/ 128M
& b. i2 D: x0 k* B1 C# jSWAP 1008M 至少是内存数量的2倍(本系统采用512M内存)
2 b4 V# g, D. ]3 U+ }8 M! F
/tmp 256M
5 C3 [/ [( W& o H J/usr 3G 系统和Apache等应用软件、源码存储于这个分区
4 g7 x* B( X2 V h" ^8 w6 a W6 ~/usr/home 7G 网站文件存储于此
& a) G) `3 z, W1 i/var 3G 数据库将使用这个分区
" v' X6 o5 B& j3 m/var/log 2811M 日志文件单独分区
/ V8 j r# s# `9 @; t
(2)选择要安装的文件(distributions):
5 i. z* R6 @( B 只安装必要的基本系统即可,绝对不要安装全部软件。在custom项目中,选取如下安装内容:
6 f& s- g' r5 ]$ K) J
bin,基本的FreeBSD系统文件;
( U) w. d: c" } [) j2 b
man,系统帮助文件;
! f) T0 T$ `" |' g
src—》sys,操作系统核心源码,定制内核时候将使用到。
* O+ g; Z0 y* G- O5 |! U: M1 P3 m
接下来,安装程序询问是否安装PORTS,为了方便安装软件,我们选择安装。但在高安全要求的系统上,最好不要使用ports或者packages,尽量自己下载源代码在本地编译,手动安装。
- q" D! k# k5 D7 H1 b* q
提示:有时,安全和易用是相互矛盾的。
4 U7 c, i" T+ J" M& S3 E) ^ 然后是拷贝文件,直至安装完毕。
4 X" M. F1 ^+ A! b( E% x/ B4 { 3.安装后的初步设置
5 i8 `9 Q0 ^ c! t: B- q3 k 安装完之后,建议您安装cvsup-without-gui(从bento.freebsd.org可以下在最新版本),并同步代码。对系统进行初步设置:
: Z* C- S; U2 C z6 L5 @ 增加用户帐号;
# ?' T1 F: W" S5 ?+ g
设置网络参数,将主机连接到网络上(全部设置完成后移动到Internet);
' N& q9 I6 B. y. M/ t+ Z: | 配置网络服务,打开FTP、SSH服务,后续的配置工作都将远程进行。
3 \7 `0 P1 O8 ^7 _" I! g# I
' b, j/ T$ h$ f 二、定制系统内核
: V3 A3 l6 A; v, I/ _ 定制系统内核内容:
" P$ x, t+ z- [6 ~( T2 L% R7 @
支持特定硬件,如SMP、RAID、大容量内存;
3 s' r% |+ m+ M8 H L! P+ g
删除多余硬件驱动支持;
4 X- |$ ~( B" |! \( Y' w 增强系统安全性,增加IP过滤防火墙支持。
+ q( u7 F; I5 C" `* I K
编辑内核设置文件,为增强安全特性,增添或修改如下内容:
2 S2 ?4 E/ z9 s7 ~4 Z! ^: p( s #启用ipfw过滤
8 `4 c+ \0 }3 j
options IPFIREWALL #打开IPFW过滤功能
7 z. D% b* F' l options IPFIREWALL_VERBOSE #设置过滤日志记录
$ D& M! x' l3 h9 ^. q options IPFIREWALL_VERBOSE_LIMIT=100 #设置日志记录限制
# b/ c$ S6 V& _3 c' M; R4 J# l
options IPFIREWALL_DEFAULT_TO_ACCEPT #设置缺省行为
: J8 f- b! M9 Q' Z options NOLKM#关闭LKM
( ]# a7 O% K1 B2 u, |; l; t* [
options TCP_DROP_SYNFIN #丢弃SYNFIN包,需要在rc.conf中打开
3 z P% U+ Y* m* Q0 g e( W #关于虚拟终端
- G. Z; H3 C/ @0 l: ~% E4 V$ V* T+ U9 J, T
#取消历史记录,在登出系统后刷新虚拟终端缓冲中的内容
8 s* S( C) }4 F. j
SC_NO_HISTORY
" c- A [+ ]) n5 @- L s8 g #取消debug键
5 w1 Q$ k+ @0 x# t. g3 e5 B
SC_DISABLE_DDBKEY
. r+ \9 J9 f7 e7 H% v
#取消ctl+alt+del键
% g. f N9 {* w: m0 U. d SC_DISABLE_REBOOT
7 F+ d C( I5 C, c: u
$ ~( ?3 J+ \* n' l: j1 |. h: o 重新编译系统内核并使之生效。
# y+ W, h( m2 H. _" A, `5 ?
三、系统配置
/ _( n4 b, m$ Q8 q0 _: C( h8 m
1.修改/etc/inetd.conf文件内容,配置inetd服务
; i: Q$ m/ s, W& n& ?9 ~
(1)telnet服务
# r. B3 D7 T; U0 C* z% V5 E; D 我们将使用SSH远程管理这台服务器,因此禁止telnet服务:在行前加"#"标记。
# F6 U5 z% {. M- R) r
(2)FTP服务
4 Q2 t' E& p: @4 Z
使用系统自带的FTP服务,并作如下设置:
4 |2 k, R- c- {7 }3 E0 U ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -h
3 @: Y: i# ~/ u6 }) ]! p. t. T -l 参数,记录每个成功或者失败的FTP登录尝试;
# o5 G8 K$ p! u# Z( U' s, W. f -l -l 参数,所有的下载、上传、删除更动作和文件名都会被记录下来(设置syslog.conf)
( U# |6 c% Y: Z4 Q. [
-h参数,将禁止主机相关信息的输出,例如ftpd版本、主机名等;
: O/ j5 j, p! U! L* @" f -P参数,指定FTPD进程监听端口号
% p- o1 v3 x4 b9 S) t) A- T
FTP服务其他安全方面的设置:
1 P& d* n# ]4 a( ^7 v4 @1 m0 S& G
把网站编辑帐号放到/etc/ftpchroot文件中,把他们限制在自己的HOME目录,防止浏览其他目录。
7 v! C) R9 r9 S& f 编辑/etc/hosts.allow 文件,限制对FTPD的访问。
5 j. A( v) O) q; Q: W$ x" v
可以编辑/etc/ftpwelcome,防止泄露系统信息。
+ i* G/ v& ?# x$ U: n, @ 2.修改/etc/rc.conf文件,配置系统初始参数
. W0 j7 R# ?+ @. K: E8 ^" d5 `4 } #配置开机器后自动启动或关闭的守护进程
7 A0 D: q2 T% x$ c' p. `' N
#可以关闭inetd,使用SSH代替了telnet服务,使用其他的FTP服务程序代替系统的ftpd。
. u% i' h% A( H9 x- Y
inetd_enable="NO"
9 a0 L- C, v2 a2 u #如果决定使用inetd则启动inetd的日志选项,并提高一个服务每分钟启动的上限数目(默认是256,建议提高到1024),防止DoS攻击;
" @: t; Z p3 e; o0 ^8 @0 }# `3 g
inetd_enable="YES"
# F# B! t6 B# b6 Q K
inetd_flags="-l -R 1024"
+ F+ }" R3 P4 C g& [ #打开SSHD
1 u& a' x! o. w$ o$ Q7 P* ~, y" e
sshd_enable="YES"
! n5 F6 i$ {' r* y3 Y. _% E( q
#禁止syslogd记录其他主机日志(关闭端口514)
5 ~7 X5 N. `% b/ v( C syslogd_enable="YES"
+ Z# V& F6 a$ ?; I% p# \ syslogd_flags="-s -s"
* I/ u1 K1 v* J2 k; D/ [$ M/ \ #关闭不必要的服务。本服务器没有NFS、NIS登需要,可以关闭portmap (关闭端口111)
( q3 `# W7 d. ~( r) x' ^8 n portmap_enable="NO"
! P1 k0 X7 d% p) k4 s- n5 x nfs_server_enable="NO"
* r. n( Q% R" c" d. h/ H
nfs_client_enable="NO"
6 J- M: Q/ c* q" _! I. n% w #使sendmail只监听localhost,允许邮件客户程序发送邮件
/ j- A$ ]" K. g9 t! Z& `- W sendmail_enable="NO"
) s' z$ H! |2 m% Y& f
#设置为"NONE",将彻底关闭25端口
1 E4 c$ ?3 E7 }" a- B* L
#设置内核安全级别(Securelevels)
4 b, ]& S: F7 v2 i/ |; ] #内核安全级别从-1到3,-1和0级别是非安全级别。
. G7 }: u+ U& |, J2 O0 x #系统在多用户模式下,安全级别只能提升不能降低。
- M1 E1 d! o! k #Securelevel -1,永久不安全模式
. a& ~& y1 G7 @: o% ^' k #Securelevel 0,不安全模式
8 l& J5 j+ C' Y/ L5 d0 P8 U. ]" Z0 ^
#Securelevel 1,安全模式
! v, W: s+ @+ N {# l
#Securelevel 2,高安全模式
/ M0 X5 K3 N/ Y
kern_securelevel_enable="YES"
* h$ h9 J3 M3 \& w& W) g kern_securelevel="2"
' b1 {8 p1 Y3 R! b
#计算机启动时候发现文件系统失效,将以-y参数运行fsck
0 Q, |+ M; Y2 ~. b9 ~# G
fsck_y_enable="YES"
$ W' y- ^8 w% ~& J #打开磁盘配额
( g p0 Y6 V" E( P enable_quotas="YES"
! K+ n0 W0 F% |0 ] check_quotas="YES"
7 s9 Q4 J+ n) ^2 Q8 y* K
#在系统启动时清空/tmp
+ k7 X% G( [ q w. _ clear_tmp_enable="YES"
; U- S" v3 ^* H0 Z* g( t/ N
#防止系统自动加入信息到motd
" t5 m' j% t3 J8 J `0 b& l update_motd="NO"
; B: B0 H' a$ x& R5 x #启动防火墙设置
+ O+ @; e& x; g% J4 T7 h firewall_enable="YES"
* x% f" }) d3 J8 R5 U9 N2 l; `
firewall_logging="YES"
% |& Q9 w* E. H
firewall_script="/etc/firewall.rules"
?% s5 ^; m) o$ I" O0 P4 D0 y- f
#丢弃SYNFIN信息包。缺省时设置为”NO”,当设置为”YES”的时候,系统内核将忽略同时设置了syn和fin位的TCP桢(需要内核的支持:options tcp_drop_synfin)
9 c# k. B. h4 q) h tcp_drop_synfin="YES"
' e( ^2 B6 o1 Q- Z #丢弃ICMP重定向。可以防止DOS攻击或劫持进程(hijack sessions)
8 f& K8 T$ k5 D, T
icmp_drop_redirect="YES"
4 \: s/ o5 I& ]& c0 P' k2 D
icmp_log_redirect="YES" #记录ICMP重定向
P% h' {2 L, V9 m& U* H& o8 P #在CISCO路由器上关闭重定向:no ip send-redirects
% p; ?, f+ P* x" v3 N
log_in_vain="YES" #记录每一个到关闭端口的连接企图。
3 y5 C* t0 A4 q, { accounting_enable="YES" #打开系统审计功能
& i; H* o! v# r) G" Z: S! m6 t8 l! V/ u! m
3.修改/etc/sysctl.conf文件,调整IP堆栈
& y, g* h' `+ ~) V, b
! v* o' m1 A+ Y4 R #关闭对广播类型的响应,过滤ICMP响应后,服务器无法ping 通,可以提高部分安全性能
9 k0 H2 m" y! s- Unet.inet.icmp.bmcastecho=0
5 B. t1 Z/ N. n [6 c$ U
#对UDP包的校验和进行计算,防止不正确的UDP包的攻击
' p6 N. j. y8 Y' A7 V [6 ]) z
net.inet.udp.checksum=1
9 l1 a, u/ b/ ]3 n" i6 W5 `
#在默认情况下,操作系统在关闭的端口上接受到TCP SYN段的时候,会发送RST信息包,告诉攻击者这个端口关闭了,导致攻击者继续扫描下一个端口,使端口扫描简单化,浪费了本机CPU时间在DOS上。我们可以使用blackhole来控制对没有socket监听的TCP或者UDP端口接受到连接请求时的行为。
1 J# l! L: r9 d1 w* o
#当设置这个选项后,系统将马上丢弃这个包而不发RST包,连接端将看到"Connection reset by peer."
+ B/ ^ R; w" ?6 J net.inet.tcp.blackhole=2
. O* D5 e0 l- ]( c( |, m net.inet.udp.blackhole=1
4 Q) F1 l8 F0 G3 |5 s0 z
4.防火墙规则设置
# H6 N) w. W- I; d' O" ^# z) g 尽管按照上面的叙述已经能够形成一定的防护,但是若要实现安全程度更高的主机系统,就要借助于IPFW这样的包过滤软件,通过设置防火墙规则,严格限制对服务器的访问。
8 S( E# U0 R# T8 c( i 过滤ICMP服务,命令格式:
. G+ u" E4 Q) R9 t) L8 \3 z2 {
ipfw add pass log icmp from $ip to any [要处理的协议]
- u2 J; w) d, Y6 m |. y7 g# l
icmp是使用类型规定出站的信息。
. r2 v* a- j8 V& y# ^/ b 0 echo-reply ping
3 u4 M/ P! L6 h( X: a3 ]
3 destination unreachable Any TCP/UDP traffic(主机不可到达)
$ g8 E$ j3 t% c4 E. E' E1 i
5 redirect routing if not running routing daemon(如果未运行路由守护程序,复位向路由)
4 G& ^- ~( p1 X; Q& J" C; H' O
8 echo-request ping (入站信息)
3 Z2 y3 b% `) W) c4 f
11 time-exceeded traceroute (traceroute 超时)
8 i. J8 F( r/ S+ y 配置文件的例子:
5 N" F, k2 f2 b ip="你自己的IP"
" ?8 @3 f0 t) |# j
#强制清除所有规则
. t" p& S3 I& c0 l4 c ipfw -f flush
4 R, f+ K6 ?& [5 }7 n& t ipfw add pass log udp from $ip to any
- V* ?3 D8 f3 \# D+ Y7 N7 t ipfw add pass log icmp from $ip to any icmp 8#接受回答
2 v4 R# b t U$ o* N ipfw add pass log icmp from not $ip to $ip icmp 0#拒绝请求
6 e& q$ u. [: Q( R- v2 L2 F. C8 Y
ipfw add pass log icmp from not $ip to any icmp 11# traceroute 超时
/ ^$ y! r. ]: U" Z" j ipfw add pass log icmp from not $ip to any icmp 3#目标主机不可到达
1 T) T& ^" v6 H1 p
#SYN、FIN组合的包一般是nmap、queso扫描器使用,所以过滤。
# L; w5 r4 E) n) I
ipfw add deny log tcp from any to any in tcpflags syn,fin
! e7 w% l1 r+ a3 x
#检查通信状态
$ j6 ?$ v/ g8 n ipfw add check-state
6 d& K3 U+ k: h) V( G0 U ipfw add deny tcp from any to any in established
. W/ D) u7 u. ^. e7 j
ipfw add allow ip from any to any out keep-state
8 W/ g1 v. e6 [( Q; K% P" h2 j" C #允许ident请求
, U, E6 E8 G$ ]# B ipfw add allow tcp from any to any 113 keep-state setup
' y, V' z! B- l. i- P" `, g+ q' m
5.日志管理
2 [* z' `6 m7 T r: T: B (1)启动日志
2 G$ F* K6 V5 h 修改/etc/rc.conf文件。使用 "-s -s"标志启动syslogd,防止打开UDP 514端口;
5 V- d, a9 o# K5 b9 |
(2)修改/etc/syslog.conf文件,配置syslogd
+ K/ j" P5 g( {* M# r7 a5 R" B/ w
#可以将本地日志记录到其他主机loghost上:
/ ?: H/ Q' k8 h) G7 W, f0 k
[email=*.*@loghost]*.*@loghost[/email]
, k7 o8 }: G- @/ E. r #为FTP增加日志条目:
/ x s5 M3 T5 o" T& f' X ftp.* /var/log/ftpd
5 M% Z& \5 Q' o; z2 K: q- W #相关命令:touch /var/log/ftpd
; H; E2 q& L: Q' w4 ~3 X! v #记录SSH连接记录
4 }+ K4 J2 F+ Z4 A) F8 x3 S& {# j security.*;auth.info /var/log/security #记录连接到SSH的日志信息
. b1 \* n: E1 e6 T5 _ auth.* /var/log/authlog
7 |& Q: |% d3 l: a. R3 {2 v1 H L* N #使ipfw能够用syslog记录
, _& q' k4 t: R9 p9 h !ipfw
. S0 Y2 [& R7 [! ]' p" h$ z *.* /var/log/ipfw.log
1 C& F0 D; w$ d/ { (3)使用newsyslog压缩日志
" Z$ O9 W5 N3 f" R( d9 X
newsyslog程序能够定时压缩日志文件并清除旧的文件是,freebsd默认安装的,它是从crontab启动的:
3 h3 j, ?. N# p #grep newsyslog /etc/crontab
& z6 G) @3 j% P8 ?3 E
0 * * * * root /usr/sbin/newsyslog
6 G. g# U! ^5 K5 x* b& _
可以修改/etc/newsyslog.conf以符合你的需求。通常把文件属性从664变为640,不让一般用户查看系统记录。
6 Y8 Q! C0 \" }# S3 _6 `. ] /var/log/authlog root.wheel 640 7 100 * Z
, b% @4 R2 N, \2 F( w /var/log/ipfw.log root.wheel 640 3 100 * Z
' K0 d# v+ p0 n
#这会在日志文件达到100K时将它压缩并编号,将mode改成640,chown成root.wheel,并删除旧的日志文件。
9 A) q4 t: z. G
#相关操作:
& D/ R# `; u D! \* I, ?: | #cd /var/log
7 i0 J- \4 [; C' ?& ~* Q3 g
#chmod g-w,o-r *;chmod a+r wtmp
( x n2 ]2 Y# v* B #把所有文件的组属性改为wheel的。
" Y. Q( ~* |6 b #防止一般用户读日志配置文件
+ [) q5 W5 ]9 y }2 X #chmod 600 /etc/syslog.conf
2 A5 f) l" Y; m' T" l" l7 r v
#chmod 600 /etc/newsyslog.conf
. {; q" N7 ]. u2 m$ V& F1 ?* s 四、用户管理
; u' I$ F+ S4 v8 |$ K; @1 I
, @8 r# N) a2 ]0 l
1.限制登录条件
: K1 N0 t& }% ^5 | (1)把个人用户放到/etc/ftpchroot文件中,把他们限制在自己的HOME目录
7 G0 v! y& l$ z) R. m/ t
(2)修改/etc/shells文件,增加不能用来登录的shell,如passwd或者nologin,赋予仅需要FTP功能的用户以/usr/bin/passwd的shell 阻止他们使用SHELL命令。
$ B! l# Q- S( @, z- U6 T5 ?5 X (3)拒绝直接以root身份登录:
( A2 l9 d! g+ p. ~- y
在/etc/ttys文件中,将"secure"标记改为"insecure"标记,使系统在进入单用户模式时会要求root密码。但是这样以来也为恢复root密码制造了障碍——安全和易用再次形成了矛盾的两个对立面。
4 P2 J2 j6 L Y
console none unknown off insecure
2 y1 \6 z" N) }: j' C (4)使用 tcp wrapper (/etc/hosts.allow)允许/拒绝访问特定的TCP服务。
' Z6 G3 S/ g% u' o
tcp_wrappers 可以在访问者要求服务前先检查/etc/hosts.allow 文件中设定的规则,符合放行规则的才会去启动服务程序,可以达到有条件开放系统服务的目的。
# x) l1 o: Q! p" w 在/etc/host.allow文件中,注释掉"ALL:ALL:allow",去掉其他无关服务访问,增加如下内容:
+ u( R6 k6 }" ^2 {- ^" r: ^& V
sshd: localhost : allow
8 m6 E+ u; O/ k* i k, u
sshd: friendlycomputer : allow
" U' |+ e5 Q1 c+ R- c' z3 h) U
sshd: all : deny
1 U* Z. r+ h [6 D 另外需要注意的是:
: E" a2 t/ @' W9 [/ X
注意规则的先后顺序,因为tcp_wrappers的规则有first match 的特性,最好把放行的规则写在前面,然后在后面加一条全部禁止的规则;
! u7 U; C2 K0 t$ r+ F 为避免 DNS 欺骗,规则尽量使用IP表示;
2 i7 e1 _2 o# c/ ~ FreeBSD缺省的/etc/hosts.allow中第一条规则是 ALL : ALL : allow,自己的规则一定要放在他前面才有效。
/ q" M) E3 _: A, m (5)使用 allowuser/allowgroup SSH配置选项以允许特定的用户和组使用SSH连接。
8 \ i$ q- ~+ {! [% o (6)限制登录的用户、组以及登录地方,修改/etc/login.access。
3 q1 f0 `. X5 c) L3 I& e) J) W
(7)利用login.conf对用户的登录环境和资源许可进行设置。
8 ?; a( a0 |) ~' p7 |# I. ` FreeBSD系统使用/etc/login.conf中描述的数据将用户按照登录环境、强制性的资源限制以及记帐管理登分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中该用户的设置中。
# p/ | u5 y% l7 x/ N 每次修改login.conf后,都要进行更新登录数据库的操作:
. t1 V1 n5 I% V/ y. r% C* b. E #cap_mkdb /etc/login.conf
) J. H6 n( x) P; X) s3 D 由于登录类别保存在master.passwd文件中,通常在使用adduser添加用户的时候设置用户的登录类别,如果要进行修改,必须使用vipw来修改/etc/master.passwd文件中的5个域。
+ X7 _; Z: ]3 \
! a0 h& r! H) p4 X& z7 x 2.登录环境
* c( r8 V3 O6 H# E& p5 P3 S6 M+ j( U) y3 d5 A# e- A
(1)编辑/etc/motd文件,阻止计算机泄露系统信息
$ p, ?$ N. f3 H0 J6 T; |: f$ ^+ T. |% l
(2)删除版权信息
+ C9 ^: T$ ^" Y7 R% A
#touch /etc/COPYRIGHT
: H6 U2 A1 _5 g: S# r
(3)防止系统自动加入信息,修改/etc/rc.conf
3 ^) d2 t! z+ D
update_motd="NO"
% c7 e- ~0 j) a& K( F
(4)修改登录提示,编辑/etc/gettytab,找到default:小节,他以下面的文字开头:
3 |, q1 m9 S4 i8 d9 L5 n; [ :cb:ce:ck:lc
# h4 U% b. t/ k$ v( k. V 小心的修改r:之间的文字来适应自己的需要。
7 q* y) v$ A3 G8 X; U' w: |
3.crontab的问题
- J2 Q% `: e5 V ~, U, `; W) w
建议 www、nobody、bind等用户不能使用crontab,建立/etc/cron/allow文件把需要使用的用户放进去,如:
$ o3 m" d' t) E
#echo root>/var/cron/allow
( t e4 h, N9 Q+ M; [/ x- G6 Q #chmod 600 /var/cron/allow
2 u9 B5 ]* U' P
如果不使用at命令,就关闭这个服务,在/etc/crontab文件中注释掉
( y# V7 u6 v. o( e, r3 P5 [ # */5 * * * * root /usr/libexec/atrun
" z- p4 S/ M) X+ P" M( l; a 4.保护文件系统
$ e# F. m" _+ @2 x. o5 Q" D7 f, r (1)锁住文件系统
$ v9 M) K! V+ z5 R: B% h
A.修改/etc/fstab文件,设置系统启动时自动挂接的文件系统,使用nosuid参数挂接/usr 或 /(目的是/sbin)文件系统,尤其是一般用户可以写入的文件系统,应单独划分分区:
! u( S3 s$ u. q" p /home or /usr/home
5 U7 g" z& p* d3 m /tmp or /var/tmp
. N' `+ c& q8 b /etc/fstab文件内容:
) r% K) Y& ?- Z$ @. n' B0 Y /dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
8 _& J" w* z2 E6 A2 m8 @ B.搜寻并去除不用的二进制文件的suid位,(尤其是uucp——setgid)
: c3 {7 m5 [( q* @
C.使用chflags设置变量,例如,给日志文件设置sappnd,给系统二进制文件设置schg标志;
. n9 |9 C3 g9 r# ~ #相关命令:
; E0 o+ [" z6 h #找出你所有的可写入目录,
8 |; f, b" v2 c9 X! L #find / -perm -0777 -type d -ls
" ?) f- ^9 e& h$ f! D 找出那些程序是suid 或者sgid的命令:
, R) `5 n3 B/ t7 E8 j. c1 ^5 a
#find / -perm -2000 -ls
6 f7 _9 E' b. K
#find / -perm -4000 –ls
. o }* q/ q) q2 K5 C R/ S (2)文件保护,严格限制系统配置文件权限,只对root用户开放读写权利:
0 a6 |9 n7 v9 X' t+ ]0 h1 k
#chflags schg /bin/*
4 {+ {. }; o2 W& W
#chflags schg /sbin/*
8 I. U$ F3 x* @ C' c2 _. m
#chmod 600 /etc/firewall.rules
1 N% J/ y& S& n #chmod 600 /etc/crontab
' m* B1 V5 K9 C3 o" o- v7 ` #chmod 600 /etc/newsyslog.conf
; U4 ~1 b2 c- Y+ @ #chmod 600 /etc/rc.sysctl
, E9 [) T# R X; B4 T* z9 \
#chmod 600 /etc/rc.conf
2 o9 a0 k; _+ T
#chmod 600 /etc/syslog.conf
* m5 q% v: H4 [8 S- H3 S" P) K$ K2 v #chmod 600 /etc/sysctl.conf
# h6 j6 K1 n4 K( k, G #防止一般用户读日志文件
# R9 I' e. H! H5 s7 x. M8 _
# chmod 640 /var/log/httpd-access.log
, f( l" v6 Q, ~# H F: v (3)可以把不是很有用的程序 chmod 000,如uustat,uucico。如果你从来不碰uucp或是PPP和PPPD的话,你绝不会用到他们。如果不用打印机的话,把lpr lprd也chmod 000了吧。
$ C# n+ N/ f% R: @) [ 5.其他相关
5 r: o7 C* E8 n0 |
修改计算机相关设置,如BIOS,不允许软盘启动、CDROM启动,即在装载硬盘驱动之前不允许其他媒介启动,设置BIOS密码,保护机器物理安全。
; L6 r _" ` }! c- f/ q: a 五、配置SSH
; r% K' ` b1 B9 X E' q: \( [
. r3 v. w' c' K- j G) v% |5 |
修改/etc/ssh/ssh_config文件
5 _/ q2 u2 q# M4 a0 z" x
(1)使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻击者通过修改携带的版本banner来劫持(hijacking)启动会话进程并降低到protocol 1。注释掉protocol 2,1 改用下面语句代替:
% M3 _- c* E8 T! c protocol 2
& @* h9 l7 R0 ^/ w& D" S (2)合理设置最大连接数量, 防止DOS攻击
0 I$ C* X' J& F9 E6 T, W
MaxStartups 5:50:10
/ x3 ~" e1 E7 v( ` (3)禁止远程root和空密码登录,建议关闭X11forwording
* { w2 [# f6 ~& Q T" \
X11Forwarding no
- F8 ?: S9 S* Y6 \) k
(4)强烈建议不使用静态密码,而使用DSA 或RSA KEY,修改如下内容可以关闭使用密码认证:
. I: S: u- P0 h4 x! z1 [
PasswordAuthentication no
& Y8 y& _$ c8 w3 G0 G' E
(5)可以限制组或光是单个用户访问shell
4 I. \- T! `9 n& O7 s% e# j7 ~ AllowGroups wheel
2 F; O3 z+ z {$ M) Y' B4 w
AllowUsers xundi
3 H" p9 A- Q4 c! w (6)使用TCP wrappers来限制一些访问,修改/etc/hosts.allow文件,注释掉"ALL : ALL : allow",增加如下内容:
. z0 f. W! V+ s- {, d) w7 k |
sshd:localhost:allow
- F& i2 B$ ]. x" x# t& U- P sshd:friendlcomputer:allow
0 E- E( B, \4 |7 X, A& ?6 [ sshd:all : deny
0 P. H6 J5 ?! J4 X. v+ e #相关命令:
8 Q9 X/ ~5 {4 X- L7 v* A$ Q #chsh -s /sbin/nologin user
" L% p, U4 j9 K' q3 H. a8 W; D: Z6 e
六、总结和补充
: t% h7 B9 |) \1 k! r
使用最新版本的操作系统;推荐使用STABLE或者最新RELEASE分支。
3 N% K, n, _& R/ v: W* |& g
修改系统前,首先备份系统。
2 p5 Z e. E7 Q2 u3 i; ] 修改/etc/inetd.conf和rc.conf关闭可有可无和不必要的服务。
/ p; n# _1 p" v$ {/ \2 j& u
立即禁用telnet,使用SSH代替之——OpenSSH在freebsd安装时即被包括。
7 _$ _: j1 [2 ~0 m% K# p- Z z 使用SSH2协议中内建的sftp服务代替标准的ftp
* Q. ^2 _" \: ^ 建立SSH公钥防止口令传输。
6 R* J6 d' G% X* e9 m 使用包过滤软件类如ipfw或者ipfilter限制服务的获取。
4 ^/ o. L/ J6 z6 D% {% C 禁止不需要的帐户
, C6 m( o$ W7 F' \0 K
应用组和用户的概念
# R; A+ z1 j n2 d6 o) y
设置正确的文件权限
+ z0 g! F( e# A. k4 [) t
以chroot环境运行具有潜在危险的程序,例如bind
7 A2 f8 Z9 w, B. \
使用sudo,非严格root级访问
0 y. B& S& b7 u 限制某些强大命令的访问
1 O, B* b2 \" P+ Y: n 如何检查你的安全性
* k# j- {7 p; ?* o: s) ~
/usr/ports/security/nmap 对自己进行端口扫描,以发现异常服务
* |+ y1 B) @. h3 _8 \
/usr/ports/security/whisker 对WEB服务器进行审计,防止潜在破坏
3 k9 P6 g m, ^7 Z; W. M* { /usr/ports/security/tripwire-
( y* Q7 x9 G G: u% d2 N& {/ @
/usr/ports/security/snort
$ e' d( _. m8 ^) m+ W 日常操作
) R* t1 v( x% ^$ ~ t: X' Q' ^7 G9 y { (1)经常查看
http://www.freebsd.org/security/index.html的安全公告;
) h: O7 ^. L) ^& Q( L: h (2)订阅security bugtraq和freebsd官方安全邮件列表了解安全动态;
5 B% p: K' z3 u: f (3)每天查看系统日志,关于检查系统日志,你可以通过其他工具增加多信息的捕获,如snort可以比较完全的记录信息;
% x/ I0 O$ p; p) V
(4)如果你的硬盘够大,信息处理够快,可以定时使用 netstat -an >> /.../.../netstat.log来记录信息,因为netstat能记录连接信息,所以如有些后门日志不能记录,但netstat却在一定时间里总有连接记录。
1 ~3 c0 w% h" S6 f, `' o0 u
(5)如果你对文件系统有原始的记录,可以定时使用一些系统完整性检查工具进行检验;
: _% o$ }' b% f. J% Y (6)如果你有防火墙,经常查看防火墙信息。