【好东西一定要转】关于Solaris安全配置的转贴和讨论

来源:互联网 发布:易企秀制作软件 编辑:程序博客网 时间:2024/04/30 13:34

转1 Sun系统的基本安全配置V1.0(by GaoXiao)
1)防止堆栈溢出(*)
2)关闭不用的服务,关闭一些无用的端口(*)
3)给系统打补丁(*)
4)消除系统中的弱智用户,定期修改用户口令,提高口令强度。
5)检查系统中SUID、SGID文件
find / \( -perm -004000 -o -perm -002000 \) -type f –print
检查系统上部正常的隐藏文件,例如…目录文件/dev下是否有可疑文件;/etc/inetd.conf是否有被替换文件;cron和at中是否运行可疑进程。
6)如果系统中开放了Ftp、www服务,则首先升级提供该服务的软件版本;FTP进行严格的权限设定;www服务要求严格检查CGI目录的文件,删除所有无用的脚本,防止恶意用户利用某些漏洞进行缓冲区溢出攻击;DDOS攻击可以通过修改ndd /dev/tcp ?;ndd /dev/ip ?中关于队列长度、最大等待时间等参数来防止。当然主要的是在边缘路由器上进行流量过滤。
7)检查r系列命令,尽量关闭该权限。如果必须开放则必须进行严格的认证措施。例如/etc/host.equiv文件(首先检查);~/$HOME/.rhost文件;
8)检查系统的文件共享问题,利用showmount命令,另外使用rpcinfo命令可以查看开放的r系列服务;rusers、finger可以探测远程用户信息。
9)查看是否有网络sniffer 的标记(*)
10)执行命令尤其是涉及到权限的命令时,一定要主要环境变量,养成良好的习惯;定期对系统的可执行文件、配置文件进行检查,可以采用第三方检查工具:tripwire
11)定期审计系统日志文件,检查是否有可疑用户登陆、程序运行。附unix系统详细日志文件说明。(*)
12)其他安全问题:例如sendmail(低版本-8.9以前有很大的隐患)、bind(8.2.2以前的版本有严重的缓冲去问题)的配置问题都会带来安全隐患;另外对xwindow的非授权使用,也会带来安全隐患,例如可以捕捉到控制台的鼠标坐标甚至屏幕,尽量不要使用xhost+命令。如果安装数据的话,也要提高数据库的安全性,因为很多数据库实际上是以root权限运行的。

#1 防止堆栈溢出

至少90%以上的安全问题都是来自所谓的“堆栈溢出”。攻击者通过给一个以root身份运行的程序提供比它所预期的输入多得多的东西,使被攻击程序无法处理而改变执行流程去执行攻击者指定的代码。

Solaris 2.6和Solaris 7都具备把用户堆栈设成不可执行的能力,以使这种攻击不
能得逞。要使能这个特点:

0)变成root
1)对/etc/system文件做个拷贝
cp /etc/system /etc/system.BACKUP
2)用编辑器编辑/etc/system文件
3)到文件的最后,插入以下几行:
set noexec_user_stack=1
set noexec_user_stack_log=1
4)保存文件,退出编辑器,一旦重启机器,这些改变就会生效。

#2 在inetd.conf中关闭用不着的服务
有许多用不着的服务自动的处于使能状态。它们中可能存在的漏洞将使攻击者甚至不需要一个账户就能控制你的机器。关闭这些不需要的服务来保护你的系统,你可以用如下方法来关闭:

0)变成root
1)对inetd的配置文件/etc/inetd.conf做个拷贝
cp /etc/inetd.conf /etc/inetd.conf.BACKUP
2)编辑/etc/inetd.conf文件
未被激活的服务是在前面被“#“符号注释掉的,举个例子,你的部份inetd.conf可能是这样的:

# Tnamed serves the obsolete IEN-116 name server protocol.
#name dgram udp wait root /usr/sbin/in.tnamed in.tnamed

不需要这个服务,因为你们中的99.999%不会用到这个“已经被废弃的IEN-116名字服务协议“,把这个注释掉以后,这行看起来会象是:

# Tnamed serves the obsolete IEN-116 name server protocol.
##name dgram udp wait root /usr/sbin/in.tnamed in.tnamed
看到这个新的“#” 符号了吧
我建议注释掉几乎所有的服务,只留下:
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
time stream tcp nowait root internal
time dgram udp wait root internal
echo stream tcp nowait root internal
echo dgram udp wait root internal
discard stream tcp nowait root internal
discard dgram udp wait root internal
daytime stream tcp nowait root internal
daytime dgram udp wait root internal
rstatd/2-4 tli rpc/datagram_v wait root /usr/lib/netsvc/rstat/rpc.rstatd rpc.rstatd
fs stream tcp wait nobody /usr/openwin/lib/fs.auto fs
100083/1 tli rpc/tcp wait root /usr/dt/bin/rpc.ttdbserverd rpc.ttdbserverd

在只需要不多图形操作的服务器或是要保证相当的安全,你也许应该关掉字体服务fs,也可以关掉系统性能监视器rstatd和tooltalk服务器ttdbserverd。事实上在确实需要安全的机器上你甚至应该注释掉telnet和ftp。

3)在/etc/inetd.conf中做出改变之后,找到inetd进程的id号,用kill向它发送HUP信号来刷新它。
4)查看/etc/services文件,关闭一些无用服务的端口(可以采用第三方的端口扫描软件辅助查看)

#3 给系统打补丁

跟所有的复杂系统一样,SUN有它的漏洞,其中的一些从性质上来说是相当严重的。SUN公司有向它的客户甚至是没有技术支持的客户提供补丁的优良传统。这些补丁或者以集合包或者以单个补丁的形式存在的。不幸的是,要完全修补你的系统,既需要大的补丁集合包,又需要单个的补丁。

1) mget 7_x86_Recommended*
2)安装补丁
首先解压补丁包:
如果你用的是Solaris 2.6或更早的,
uncompress 2*Recommended.tar.Z
tar -xvf 2*Recommended.tar
如果用的是Solaris 7,
unzip 7*Recommended.zip
其次,把所有的单个补丁移到你的建立的Recommended目录:
mv 1* *Recommended
然后,进到保存有全部补丁的Recommended目录:
cd *Recommended

16)到现在所有的补丁都准备好了,关闭计算机:
/usr/sbin/shutdown -y -g0 -i0
启到到单用户模式,
对sparc:
boot -s
对x86, 启动时, 键入:
b -s

系统引导后,在提示符后输入root口令后,键入:
mountall
来mount所有的文件系统。
然后输入:
cd /var/tmp/patch/*Recommended
进到保存所有补丁的目录,现在你可以键入以下命令来安装“所有”的补丁了:
./install_cluster
打完补丁后,关机重启,输入:
/usr/sbin/shutdown -y -g0 -i6

#9当系统入侵发生时,入侵者可以在UNIX系统上暗地里安装一个网络监视程序,通常称sniffer(or packet sniffer),用于捕获用户账号和密码信息.对于NT系统,为达到相同目的,通常更多地使用远程管理程序检查sniffer是否被安装到系统中的第一步是看看是否有进程把任何网络设备置成混杂(promiscuous)模式.如果任一网络设备处于混杂模式,那系统中就有sniffer程序.如果在发现入侵的时候就重启机器或在单用户模式下操作,就不可能探测到处于混杂模式的网卡.
为此有一些工具可以使用.
cpm - UNIX
ftp://coast.cs.purdue.edu/pub/tools/unix/cpm/
ifstatus - UNIX
ftp://coast.cs.purdue.edu/pub/tools/unix/ifstatus/
(ifconfig -i命令也可以报告网卡状态)

注意某些合法的网络监视和协议分析器会将网卡置成混杂模式.探测到某块网卡处于混杂模式并不就一定意味着系统中有入侵者的sniffer在运行.sniffer的记录文件大小通常会很快增长,使用诸如df之类的工具可以确定文件系统的哪部分增长超过预期.记住df,ifconfig,netstat这些命令通常在黑客安装sniffer程序的时候都被木马替换掉了,要使用干净的工具来检查网卡状态. 如果在系统中发现了sniffer,强烈建议检查sniffer的输出文件,以确定还有哪些主机处于危险境地.处于危险境地的主机是指那些出现在被捕获数据包目的域中的主机.但是如果口令跨系统使用或者源目的主机相互信任,则源主机也处于危险境地.

#11不同版本的Unix日志文件的目录是不同的,最常用的目录是:

/usr/adm 早期版本的
Unix /var/adm 较新版本的
Unix /var/log 用于Solaris,Linux,BSD等
/etc Unix system V早期版本
在这些目录下,或其子目录下,你可以找到以下日志文件(也许是其中的一部分):

lastlog 记录用户最后一次成功登录时间
loginlog 不良的登陆尝试记录
messages 记录输出到系统主控台以及由syslog系统服务程序产生的消息
utmp 记录当前登录的每个用户
utmpx 扩展的utmp
wtmp 记录每一次用户登录和注销的历史信息 wtmpx 扩展的wtmp
vold.log 记录使用外部介质出现的错误
xferkig 记录Ftp的存取情况 sulog 记录su命令的使用情况
acct 记录每个用户使用过的命令
aculog 拨出自动呼叫记录
下面按顺序仔细介绍一下
lastlog文件
Unix在lastlog日志文件中记录每一个用户注册进入系统的最后时间,在你每一次进入系统时,系统会显示出这个时间:
login: blackeyes
password: h3ll0
Last login :Tue Jul 27 09:55:50 on tty01
lastlog告诉用户,要核对一下最后注册进入系统的时间是否争确,若系统显示的时间与你上次进入系统的时间不符,说明发生了非授权用户注册,若这种情况发生了,用户应该马上修改帐户口令,并通知管理员。在每次注册时,lastlog新的内容冲掉老的内容。
标准版本的Unix没有提供服务程序可以阅读lastlog文件,有些程序可以提供这个服务,跟我们这里要 谈的东西关系不太大,以后再说了。

loginlog文件
Unix system V版本中,可以把不成功的登录行为记录在/var/adm/loginlog中。要登记不成功的注册行为,可以用下列命令建立/var/adm/loginlog文件:
#touch /var/adm/loginlog
#chmod 600 /var/adm/loginlog
#chown root /var/adm/loginlog
如果你知道一个系统的用户名,而你又想猜出密码,/var/adm/loginlog就会记录你的失败的登录尝试 管理员看看/var/adm/loginlog的内容,你的企图就露馅了:
#cat /var/adm/loginlog
hacker: from 202.88.88.xx: Tue Jul 27 02:40:50 1999
hacker: from 202.88.88.xx: Tue Jul 27 02:41:50 1999
hacker: from 202.88.88.xx: Tue Jul 27 02:42:50 1999
hacker: from 202.88.88.xx: Tue Jul 27 02:43:50 1999
hacker: from 202.88.88.xx: Tue Jul 27 02:44:50 1999
messages文件

记录输出到系统主控台以及由syslog系统服务程序产生的消息
先看看syslog问题syslog采用可配置的、统一的系统登记程序,随时从系统各处接受log请求,然后根据/etc/syslog.conf中的预先设定把log信息写入相应文件中、邮寄给特定用户或者直接以消息的方式发往控制台。值得注意的是,为了防止入侵者修改、删除messages里的记录信息,可以采用用打印机记录或跨越网络登记的方式来挫败入侵者的企图。

syslog.conf的详细说明
以Sun Solaris operating system, version 2.5.1. 为例
/etc/syslog.conf的一般格式如下:
设备.行为级别 [;设备.行为级别] 记录行为
设备 描述
auth used by authorization systems (login) 认证系统,即询问用户名和口令
cron used for the cron and at systems 系统定时系统
daemon system/netword daemon 其他系统的daemons
kern produced by kernel messages 内核
lpr printing system 打印机系统
mail mail system 邮件系统
mark internally used for time stamps 定时发送消息的时标程序
news reserved for the news system 新闻系统
user default facility, used for any program 正式用户处理程序
uucp reserved for the uucp system uucp子系统
local0..7 reserved for local use 留做指定站点使用
行为级别 描述
debug normally used for debugging 调试程序时的消息
info informational messages 信息消息
notice conditions that may require attention 要注意的消息
warning any warnings 警告
err any errors 一般性错误
crit critical conditions like hardware problems 严重情况
alert any condition that demand immediate attention 应该立即被纠正的情况
emerg any emergency condition 紧急情况
none Do not send messages from the indicated 指定的服务程序未给所选择的
facility to the selected file. 文件发送信息


记录归属(举例) 描述

/dev/console send messages to devices 控制台
/var/adm/messages write messages to files 写入/var/adm/messages
@loghost forward messages to a loghost 其他的日志记录服务器
fred,user1 send messages to users 传送消息给用户
* send messages to all logged-in users 传送消息给所有的在线用户

下面是一个/etc/syslog.conf的模式

*.notice;mail.info /var/log/notice
*.crit /var/log/critical
kern,mark.debug /dev/console
kern.err @server
*.emerg *
*.alert root,operator
*.alert;auth.warning /var/log/auth


如果用打印机来记录日志文件,可以采用如下方法:
把打印机连接到终端端口/dev/ttya上,在/etc/syslog.conf中加入配置语句,例如:
auth.* dev/ttya
这样就可以记录如不正确口令等信息了。
如果采用跨越网络登记,可以在/etc/syslog.conf中加入配置语句,例如:
auth.* @loghost
可以采用非unix主机来作为日志记录机,这样的话入侵者就算是得到了root权限也没有办法修改日志文件。
在/var/adm/messages中的一些记录,可以找出入侵者的痕迹,举例如下:
1.Jun 21 06:17:55 youserver /usr/dt/bin/rpc.ttdbserverd[371]: _Tt_file_system::findBestMount.
Jun 21 06:17:55 youserver inetd[146]: /usr/dt/bin/rpc.ttdbserverd: Segmentation Fault - cod
Jun 21 06:17:58 youserver inetd[146]: /usr/dt/bin/rpc.ttdbserverd: Illegal Instruction - cd
入侵者利用rpc.ttdbserverd漏洞进攻服务器
2."Sep 8 09:08:03 xxx login: REPEATED LOGIN FAILURES ON /dev/pts/3 FROM xxxxx "
入侵者采用暴力试口令命令失败
3."Sep 8 09:08:03 xxx su: 'su root' failed for xxxxx on /dev/pts/2"
入侵者想利用su命令成为root失败
关于messages可以利用tail -f /var/adm/messages命令来查看


此文章相关评论: 该文章有6个相关评论如下:(点这儿可以发表评论)carlous发表于: 2002/07/24 03:00pm
转2 Solaris安全FAQ
本文出自: 作者: quack(quack@antionline.org)
参考资料:The Solaris Security FAQ by Peter Baer Galvin

1) (概述--略)

2) 怎样将Solaris配置得更加强壮?

2.1) 哪些文件的许可权限需要改变?

有个叫fix-modes的软件(ftp://ftp.fwi.uva.nl/pub/solaris/fix-modes.tar.gz)可以在
Solaris 2.4和2.5上运行并改变系统文件及目录的存取权限,这样会使非ROOT的用户更难
于更改系统文件或者取得ROOT权限。

2.2) 如何对ROOT的环境加以配置?

将umask设为077或者027.

查看你的环境中路径设置情况,不要有./

2.3) 我该更改哪些启动文件?

通常情况下,你要检查所有在/etc/rc2.d和/etc/rc3.d以S开头的文件,所有并非必要的设备
或者服务都可以重命名(不要再以S开头),然后你可以重新启动,从/var/adm/messages中来
观察自启动的情况,并且从ps -elf的输出中加以检查。

2.4) 如何将ROOT的远程登陆取消?

在/etc/default/login里加上 "CONSOLE"行,在/etc/ftpusers里加上root。

2.5) 如何取消rlogin/rsh服务?

移去/etc/hosts.equiv和/.rhosts以及各home目录下的.rhosts,并且在/etc/inetd.conf中
把r系列服务都杀掉,然后找出inetd的进程号,重启它。

2.6) 哪些帐号是不必须的?

移去或者锁定那些不是必须的帐号,比如sys\uucp\nuucp\listen等等,简单的办法是在
/etc/shadow的password域中放上NP字符。

2.7) 怎样保护我的设备?

在文件/etc/logindevperm中包含了对系统设备的许可权限配置信息,应该检视里面的各项
设定并且手动赋予你所想要的许可权限。

对于抽取式的BSM设备需要设定只有single user允许进入。

2.8) 我应该将/etc的存取权限改为什么才安全?

用chmod -R g-w /etc命令来移去组用户对/etc的写权限。

2.9) Solaris机器充当路由器?

默认情况下,如果Solaris机器有超过一块的网卡的话,它将会在不同网卡间转发数据包,这一行为可
以在/etc/init.d/inetinit中得到控制。要在Solaris 2.4或者更低版本机器下关闭它,可以将
ndd -set /dev/ip ip_forwarding 0添加于/etc/init.d/inetinit的未尾。在Solaris 2.5
中,只要touch /etc/notrouter.

2.10) 如何取消automounter?

Automounter是由/etc/auto_*这些配置文件控制的,要取消它,只要简单地移去这些文件,
并且/或者将/etc/rc2.d/S74autofs改名。

2.11) 如何取消NFS服务?

NFS的共享输出是由/etc/dfs/dfstab文件管理的.可以删除它。要将NFS服务器的守护进程关闭
则可以重命名/etc/rc3.d/S15nfs.server。要防止一台机器成为NFS客户机,可以重命名文件
/etc/rc2.d/S73nfs.client——当重命名这些自启动文件时,要注意不要将文件的首字母设为
“S”。

2.12) 对cron任务我该注意些什么?

你得查看所有的cron任务——在/var/spool/cron/crontabs文件中你可以找到它们。还必须在
/etc/default/cron里设置了"CRONLOG=yes" 来记录corn的动作。

2.13) 使用动态路由有什么风险吗?

使用动态路由守护进程的机器用in.routed及in.rdisc来维护路由,这可能会大大增加路由协议的复杂程
度,而且路由更新会消耗相当大比便的可用带宽,因此在可能的情况下,还是建议你使用静态路由。

2.14) 何时及如何运用静态ARP?

ARP是联系IP地址和以太网的协议(地址转换协议) 。默认地,Solaris机器动态地确定ARP地址,arp命令
可以用来静态地设定ARP表并且刷新它,如果你的系统里仅有少量无需更改的机器,那么这是一个很好的工具。
为了防止ARP欺骗,最好将受托机器的硬件地址作为永久条目保存在ARP的高速缓存中。

2.15) 运行rpcbind是不安全的吗?

rpcbind是允许rpc请求和rpc服务之间相互连接的程序,但标准的rpc是不安全的:(,它使用的是"AUTH_UNIX"
验证, 也就是说它依靠的是远程系统的IP地址和远程用户的UID来验证。一般的系统可能需要某些rpc存在,但
对各种服务器如Web servers, ftp servers, mail servers, etc)最好将rpc服务关闭,你也可以通过
一些安全工具来确定rpc服务是否会影响到你系统的安全性。可以通过将/etc/rc2.d/S71RPC改名来禁止rpc。

2.16) /etc/utmp的权限应该如何设定?

# chmod 644 /etc/utmp

2.17) 哪些程序可以去掉SUID位?

许多setgid和setuid程序都只是由root运行的,或者是由某些特定用户或组运行,那就可以将其setuid位
移去,下面是一个Solaris 2.6上setuid程序的列表,你应该根据自己的情况进行增减。

# find / -perm -4000 -print
/usr/lib/lp/bin/netpr
/usr/lib/fs/ufs/quota
/usr/lib/fs/ufs/ufsdump
/usr/lib/fs/ufs/ufsrestore
/usr/lib/fs/vxfs/vxdump
/usr/lib/fs/vxfs/vxquota
/usr/lib/fs/vxfs/vxrestore
/usr/lib/exrecover
/usr/lib/pt_chmod
/usr/lib/sendmail
/usr/lib/utmp_update
/usr/lib/acct/accton
/usr/lib/uucp/remote.unknown
/usr/lib/uucp/uucico
/usr/lib/uucp/uusched
/usr/lib/uucp/uuxqt
/usr/lib/sendmail.orig
/usr/openwin/lib/mkcokie
/usr/openwin/bin/xlock
/usr/openwin/bin/ff.core
/usr/openwin/bin/kcms_configure
/usr/openwin/bin/kcms_calibrate
/usr/openwin/bin/sys-suspend
/usr/dt/bin/dtaction
/usr/dt/bin/dtappgather
/usr/dt/bin/sdtcm_convert
/usr/dt/bin/dtprintinfo
/usr/dt/bin/dtsession
/usr/bin/at
/usr/bin/atq
/usr/bin/atrm
/usr/bin/crontab
/usr/bin/eject
/usr/bin/fdformat
/usr/bin/login
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/ps
/usr/bin/rcp
/usr/bin/rdist
/usr/bin/rlogin
/usr/bin/rsh
/usr/bin/su
/usr/bin/tip
/usr/bin/uptime
/usr/bin/w
/usr/bin/yppasswd
/usr/bin/admintool
/usr/bin/ct
/usr/bin/cu
/usr/bin/uucp
/usr/bin/uuglist
/usr/bin/uuname
/usr/bin/uustat
/usr/bin/uux
/usr/bin/chkey
/usr/bin/nispasswd
/usr/bin/cancel
/usr/bin/lp
/usr/bin/lpset
/usr/bin/lpstat
/usr/bin/volcheck
/usr/bin/volrmmount
/usr/bin/pppconn
/usr/bin/pppdisc
/usr/bin/ppptool
/usr/sbin/allocate
/usr/sbin/mkdevalloc
/usr/sbin/mkdevmaps
/usr/sbin/ping
/usr/sbin/sacadm
/usr/sbin/whodo
/usr/sbin/deallocate
/usr/sbin/list_devices
/usr/sbin/m64config
/usr/sbin/lpmove
/usr/sbin/pmconfig
/usr/sbin/static/rcp
/usr/sbin/vxprint
/usr/sbin/vxmkcdev
/usr/ucb/ps
/usr/vmsys/bin/chkperm
/etc/lp/alerts/printer

而且还应该建立一个setuid/setgid程序的列表,日后可以对比是否有新的setuid程序出现--这可能是
入侵者光临过的征兆。

2.18) 哪些系统工具我可以去掉它?

所有的网络工具你都应该检查并且确定它在你的系统环境里是否是必需的,如果答案为否的话,就
干掉它,下面这些工具有些可以在开始文件中找到它,有些则上在/etc/inetd.conf中被启动的,注
释掉那些不必要的服务,并且kill -HUP inetd守护进程——类似的东西有:

tftp systat rexd ypupdated netstat
rstatd rusersd sprayd walld exec
comsat rquotad name uucp

最好把常规的inetd.conf替换掉——改成只开telnet和ftp服务——如果你真的需要它们的话(建议再
用防火墙建立阻塞)。

2.19) 我应该运行in.fingerd吗?

in.fingerd在过去有一些安全问题,如果你想提供finger工具,用nobody来运行它。

2.20) 如何让syslog有更大作用?

默认情况下,syslog仅提供最精简的记录,你可以通过编辑/etc/syslog.conf文件来让syslog记
录更多的信息,然后你需要重启syslog以使它读取配置文件。

你还可以通过

touch /var/adm/loginlog
chmod 600 /var/adm/loginlog
chgrp sys /var/adm/loginlog

来建立login的记录。

2.21) 对EEPROM如何做才能更安全?

将EEPROM设于安全的模式:通过设定对"ok setenv security-mode=command"的密码保护来实现。
当然这并不能真正地防止入侵,如果某人可以物理接触某控制台的话,它就能打开机器并替换掉EEPROM,
更改hostid........

2.22) 我的机器是处于“混杂模式”下吗?

在Solaris下,你只能通过安装某些工具来判断是否机器是处于混杂模式下,可以参见第三部分。只有当你
运行诸如snoop或者某些网络监听软件时机器才会处在混杂模式下,如果你并没有监听整个网络,那极大的可
能性就是黑客已经侵入到你的系统中并且开始以监听来接收数据了。

2.23) 如果我必须运行NFS,如何使它更安全?

在/etc/dfs/dfstab中的所有文件将被所有人共享,默认情况下,NFS客户会以"-o rw"或者"-o ro"选项
共享。
必须使用"nosuid"参数来使setuid程序失效。
不要通过rpcbind来运行nfs mount。而是用更安全的rpcbind替代程序或者安装SUN最新的rpcbind补丁。
在可能的情况下,尽量使用secure-RPC。否则的话,你运行的是"AUTH_UNIX"认证,它仅仅依靠客户的IP地
址来进行验证,很容易有IP欺骗的情况发生。
在可能的情况下,不要使用NFS,因为它的信息传递是通过明文的(甚至你用了"AUTH_DES"或者"AUTH_KERB"来
进行认证)所以传输的任何文件对嗅探来说是及危险的。
有程序可以猜度ROOT所mountr的文件名柄,并且获得NFS server上的文件。

2.24) 如何让sendmail更安全?

sendmail总是不断地有新漏洞被发现,怎样才能使它更安全呢?

使用最新版本的Berkeley sendmail (see section 3)
使用smrsh (section 3)
从/etc/aliases里删除decode
将/etc/aliases的权限设为644
可以考虑使用代理防火墙来过滤SMTP中不必要的命令。

2.25) NIS是安全的吗,如何使其更强壮?

NIS从来就不是一个安全的服务,如果配置得当的话NIS+会更好些,就象暴力破解密码一样,NIS域名
如果被猜出来,就会给入侵者提供相当丰富的信息,要关闭这个漏洞,可以将信任主机的地址放在
/var/yp/securenets中。并且考虑使用NIS+或者secure RPC。

2.26) 匿名FTP要怎样才会安全可靠?

Solaris 2.5 ftpd(1M)包含了一个很好的FTP配置说明

cp /etc/nsswitch.conf ~ftp/etc
确保包含~ftp的文件系统在被安装是没有用nosuid选项
在~ftp下任何文件的属主都不是"ftp"
更详细的信息参见它的配置说明及FAQ

2.27) 如何将X配置得更安全?

使用SUN-DES-1选项来调用Secure RPC来通过X鉴别,可以使用xhost +user@host来通过访问请求。

2.28) 如何打开SUN-DES-1的鉴别机制?

set DisplayManager*authorize: true
set DisplayManager._0.authName: SUN-DES-1
rm ~/.Xauthority
增加对localhost的许可权限:通过xauth local/unix:0 SUN-DES-1 unix.local@nisdomain
xauth local:0 SUN-DES-1 unix.local@nisdomain
Start X via xinit -- -auth ~/.Xauthority
把你自己加入,并移去其他所有人:xhost +user@ +unix.local@nisdomain -local -localhost
赋予用户foo进入主机"node"的权限:

允许foo进入node: xhost +foo@
建立适当的foo的xauthority: xauth add node:0 SUN-DES-1 unix.node@nisdomain
foo现在就能连上"node"了: xload -display node:0

2.29) 我需要安装哪些补丁?

用showrev -p命令来察看补丁在系统里的安装情况,在你想保护的主机以及大众都可以访问的主机
上,你应该到SUN公司的主页上去查找相关的补丁包来安装,并且应该常常查看最新的补丁发布情况。

2.30) 如何防止在堆栈中执行代码?

入侵者常常使用的一种利用系统漏洞的方式是堆栈溢出,他们在堆栈里巧妙地插入一段代码,利用
它们的溢出来执行,以获得对系统的某种权限。

要让你的系统在堆栈缓冲溢出攻击中更不易受侵害,你可以在/etc/system里加上如下语句:

set noexec_user_stack=1
set noexec_user_stack_log =1

第一句可以防止在堆栈中执行插入的代码,第二句则是在入侵者想运行exploit的时候会做记录:)

3) 应该增加或者替代哪些程序?

3.1) inetd

inetd可以用xinetd代替,以增加日志功能。
xinetd:
ftp://qiclab.scn.rain.com/pub/security/xinetd*
或 ftp://ftp.dlut.edu.cn/pub/unix/sun-source/xinetd-2.1.tar.Z(不知是否为最新版本).

3.2) ifstatus

ifstatus可以确定你的网卡是否工作于混杂模式(有人进行网络监听?)
url:
ftp://coast.cs.purdue.edu/pub/tools/unix/ifstatus/

3.3) xntp

xntp是有个更安全的网络时间协议(Network Time Protocol).
URL:
ftp://ftp.udel.edu/pub/ntp/xntp3-5.93.tar.gz (1907KB)
3.4) sendmail

用Berkeley Sendmail(http://www.sendmail.org/)替代Solaris自带的sendmail.

3.5) rpcbind

可以用如下URL中的rpcbind替换Solaris自带的rpcbind, 这个rpcbind包含了类似
于tcpwrapper的功能并关闭了通过rpcbind访问NFS.

ftp://ftp.win.tue.nl/pub/security/rcpbind_1.1.tar.Z

3.6) 口令检查程序

很不幸,Solaris 上还未发布passwd+及npasswd, 这两个程序可以用于检查在UNIX
上那些愚蠢的口令。

3.7) crack

crack可以找出/etc/shadow中那些容易猜测的口令,虽然运行crack将会使CPU的
负载加重,但它在第一次运行时就可以给出10%系统帐号的口令。

URL: (我想国内很多站点已有此程序了。)
ftp://sable.ox.ac.uk/pub/comp/security/software/crackers/

3.8) ftp

不用多说,使用wu-ftpd, 国内站点上有的是,如果找不到,试试:
URL:
ftp://ftp.dlut.edu.cn/pub/unix/ftp/wu-ftpd/
OR:
ftp://wuarchive.wustl.edu/packages/wuarchive-ftpd

3.9) fix-modes

用于纠正Solaris 2.2 ~ 2.6系统中敏感文件及目录的属性,以适应安全性需要。
URL:
ftp://ftp.dlut.edu.cn/pub/unix/security/fix-modes.tar.gz
OR:
http://www.fwi.uva.nl./pub/comp/solaris/fix-modes.tar.gz

3.10) noshell

可用于不希望登陆系统的用户的shell, 能够记录发生的事件并防止用户login.

3.11) bind

标准的Solaris里带的bind有着众所周知的安全问题(参见CERT第4部份),现在的发行版已经做
了修补。

3.12) netcat

NetCat对系统管理员和入侵者来说都是很实用的工具,它可以在两个系统间建立灵活我TCP连接。

5) 如何使我的Solaris Web server更安全?

下面的方法可以令你的以Solaris为基础的系统十分安全,你同时还可以配以利用防火墙及过滤路由
器来组成一个完整而强大的网络拓扑,但是,没有任何系统是完美的,所以你除了关注安全动态,给机
器作好防范之外,也不应该在机器上装载其他无关的第三方的软件--webserver需要的是安全,而不是
对管理员的方便。

5.0) Web server安全检查

用下面的安全检查列表来察看你的系统是否是安全地安装的,当然如果你有特殊的安全需求则不一定以此为准:

在完成一切安全设置前将系统与互联网断开
仅仅安装系统的核心部分以及需要的软件包
安装推荐的安全补丁
修改系统的开始文件来进行
在/etc/init.d/inetinit中关闭IP转发
改变/tmp的存取权限(可以在系统的开始文件中加入脚本
用ps检查进程情况
Invoke sendmail from cron to process queued mail occasionally.
安装配置tcp_wrappers, S/Key, wu-ftp及tripwire于你的系统环境。
编辑/etc/hosts.allow来确定可进入的机器,并且编辑/etc/inetd.conf注释掉所有不需要的服务
用syslog记录下所有的telnet连接通信
Mount上的文件系统要是只读而且是no-suid的
确定/noshell是除了root之外所有不希望进入的帐号的默认shell
删除/etc/auto_*, /etc/dfs/dfstab, p/var/spool/cron/crontabs/* (except root).
使用静态路由
测试你的系统,包括允许及拒绝访问的配置及记帐系统
考虑使用更安全版本的sendmail, syslog, bind以及crontab来替代现有的
安装xntp来有更精确的时间戳
考虑更详细地系统记帐
保持监听和测试Web server的习惯

在你完成上面的配置之后,你的系统已经会比安装一个标准的UNIX系统,并配以标准配置更安全了。

5.1) 硬件上......

在系统完全安装好并且配置得更安全之前,不要将它放到互联网上——从理论上说,一些入侵者喜欢
在你把系统弄得完美之前溜进去放几个后门——而且最好从CD-ROM安装你的系统并且将二进制文件
加载在磁带机或者软盘上物理写保护.......

5.2) 安装系统

从最新的,可靠的Solaris2.x版本安装,每一版本的Solaris都会比前一版更安全一些的。

Solaris是非常灵活并且包含了大量工具可供使用的。但不幸的是,这些外带的功能软件包可能也会
导致一些潜在的危险,所以要建立一个安全的系统,最好的办法是,只安装基本的OS部份,其余的软件
包则以必要为原则,非必需的包就可以不装——这样还可以使机器更快和更稳定:)

在Solaris的安装程序里,你可以选择Core SPARC installation cluster来安装,事实上,就连
这个选项都还有些东西是不必要的确良:(,但它的确是一个安全的系统基础,另一个好处是,它需要的空
间很少,看看下面你就知道了:

s0: / 256 megabytes
s1: swap 256 megabytes
s2: overlap
s3:
s4:
s5:
s6: /local ??? megabytes (rest of the drive)
s7:

/var要足够大以放置审核记录文件,而swap分区则与你的硬件(内存)相适应就行了,当然大的swap
分区可以在应付DoS攻击时更强有力。

现在可以用另外的机器,ftp到sunsolve.sun.com:/pub/patches并且下载最新的推荐补丁,将它放
在磁带机中转到你的“安全主机”上,然后安装这些补丁,当然有些补丁可能安装不上,因为它所
要补的那个软件你没有安装:)

5.3) 系统里的Strip

在Solaris下,你可以通过对/etc/rc[S0-3].d文件来修改启动时自引导的动作:

考虑移去/etc/rc2.d中在你系统中用不到的服务,我还建议你移除/etc/init.d里除下以下列表中
文件外的所有东西:

K15rrcd S05RMTMPFILES K15solved S20sysetup
S72inetsvc S99audit S21perf
S99dtlogin K25snmpd S30sysid.net S99netconfig
K50pop3 S74syslog S75cron S92rtvc-config
K60nfs.server K65nfs.client S69inet
K92volmgt README S95SUNWmd.sync
S01MOUNTFSYS S71sysid.sys S88utmpd S95rrcd

这些文件可能会与你的不同--这取决于你机器里的图形卡/是否使用Solaris DiskSuits等等。
移除/etc/rc3.d里的文件........

举例来说,在Solaris 2.4中,你应该编辑/etc/init.d/inetinit在文件的尾部增加以下行:

ndd -set /dev/ip ip_forward_directed_broadcasts 0
ndd -set /dev/ip ip_forward_src_routed 0
ndd -set /dev/ip ip_forwarding 0

并且通过设定ndd -set /dev/ip ip_strict_dst_multihoming 1来关闭"ip_strict_dst_multihoming"
核心变量。solaris机器就不会在两块网卡间转发IP包,这可以防止host spoof。

* 在Solaris 2.5下,只要建立一个叫/etc/notrouter的文件就能阻止IP转发,要重新打开它,只要移除
/etc/notrouter并重启动系统就行了。It's important to note that there is a small time
window between when this file is created and when routing is disabled,
theoretically allowing some routing to take place.

在Solaris 2.4下,添加一个新的脚本名为/etc/init.d/tmpfix:


#!/bin/sh
#ident "@(#)tmpfix 1.0 95/08/14"

if [ -d /tmp ]
then
/usr/bin/chmod 1777 /tmp
/usr/bin/chgrp sys /tmp
/usr/bin/chown root /tmp

并且连接/etc/init.d/tmpfix到/etc/rc2.d/S79tmpfix,这样这个脚本就会在系统启动时执行了。
这可以使入侵者更难在系统里夺取root权限。在Solaris 2.5则不必如此。

另外还有一些好的建议,就是在启动时为用户设定安全的umask,下面的script就是做这事儿的:

umask 022 # make sure umask.sh gets created with the proper mode
echo "umask 022" > /etc/init.d/umask.sh
for d in /etc/rc?.d
do
ln /etc/init.d/umask.sh $d/S00umask.sh
done

Note: 脚本名称中的".sh"是必需的,这样脚本才会在本shell而不是它的子shell中执行。

删除/etc/auto_*文件,删除/etc/init.d/autofs可以防止automounter在启动时就运行。

删除/etc/dfs/dfstab,清除/etc/init.d以防止机器成为NFS服务器。

删除crontab文件,你可以将/var/spool/cron/crontabs中属主root以外的文件全部删除。

使用静态路由,建立/etc/defaultrouter来维护之,以避免spoof。如果你必须通过不同的网关,考虑增
加/usr/bin/route命令于/etc/init.d/inetinit以取代运行routed。

当地切完成时,重启机器,彻底地查看进程,ps -ef的输出应该是这样的:

UID PID PPID C STIME TTY TIME COMD
root 0 0 55 Mar 04 ? 0:01 sched
root 1 0 80 Mar 04 ? 22:44 /etc/init -
root 2 0 80 Mar 04 ? 0:01 pageout
root 3 0 80 Mar 04 ? 33:18 fsflush
root 9104 1 17 Mar 13 console 0:00 /usr/lib/saf/ttymon -g -h -p myhost console
login: -T sun -d /dev/console -l co
root 92 1 80 Mar 04 ? 5:15 /usr/sbin/inetd -s
root 104 1 80 Mar 04 ? 21:53 /usr/sbin/syslogd
root 114 1 80 Mar 04 ? 0:11 /usr/sbin/cron
root 134 1 80 Mar 04 ? 0:01 /usr/lib/utmpd
root 198 1 25 Mar 04 ? 0:00 /usr/lib/saf/sac -t 300
root 201 198 33 Mar 04 ? 0:00 /usr/lib/saf/ttymon
root 6915 6844 8 13:03:32 console 0:00 ps -ef
root 6844 6842 39 13:02:04 console 0:00 -sh

/usr/lib/sendmail守护程序并没有打开,因为你不必总在25端口监听mail的列表请求,你可以在root的
crontab文件中增加:

0 * * * * /usr/lib/sendmail -q > /var/adm/sendmail.log 2>&1

这条命令要以每小时调用sendmail进程处理排队中的邮件。

5.4) 安装第三方软件

你需要的第一个软件是TCP Wrappers软件包——由Wietse Venema写的,它提供了一个小的二
进制文件叫tcpd,能够用它来控制对系统服务的进出——比如telnet及ftp,它在/etc/inetd.conf
中启动,访问控制可以由IP地址、域名或者其它参数来限制,并且tcpd可以提升syslog的记录
级别,在系统遇到未经认证的连接时,发送email或者警告给管理员。

然后安装S/Key来控制远程连接的安全性,可以在Q5.6中看到详细的配置方法。

如果你打算打开ftp服务(不管是匿名ftp或者是出了管理目的),你需要取得一份WU-Archive ftp,
最好要拿到它的最新版本,否则会有一些安全漏洞存在,如果你认为需要管理员的远程登陆服务的
话,可能得修改S/Key来支持ftp daemon。在Crimelabs S/Key的发行版本中,你可以在找到
S/Key/misc/ftpd.c,这个C程序示范了如何让S/Key支持WU-Archive ftp,你可以对新版的WU-FTP
做类似的改动,当然你可能要阅读wu-ftp FAQ以增加了解。

编译并且安装了这些二进制文件后(tcpd, wu-ftpd及keyinit, keysu,keysh),它们会被安装在
/usr/local/bin中,当编译wu-ftpd时你需要指定一个配置文件及日志的存放目录,我们推荐你将
配置文件放在/etc下,将日志文件放在/var下,Q5.7更详细地说明了wu-ftp的配置。

用/noshell来阻止那些不想让他们进入的帐号,让/noshell成为那些人的shell。这些帐号不允许登陆
并且会记录下登陆的企图,入侵者无法通过这种帐号入侵。

5.5) 限制通过网络进入系统


telnet和ftp守护进程是从inetd进程启动的,inetd的配置文件是/etc/inetd.conf,还包含了其它
的各种服务,所以你可以干脆移去这个文件,新建一个只包括以下两行的文件:

ftp stream tcp nowait root /usr/local/bin/tcpd /usr/local/bin/wu-ftpd
telnet stream tcp nowait root /usr/local/bin/tcpd /usr/sbin/in.telnetd

当然这是基于你需要telnet及ftp的基础上的,如果你连这两个服务都不用的话,你就可以将它注释
掉或者删除,这样在系统启动的时候inetd甚至就起不来了:)

tcpd的访问控制是由/etc/hosts.allow和/etc/hosts.deny文件控制的,tcpd先查找/etc/hosts.allow
,如果你在这里面允许了某几台主机的telnet或ftp访问的话,那么deny访问就是对其它所有机器的了。
这是“默认拒绝”的访问控制策略,下面是一个hosts.allow文件的样本:

ALL: 172.16.3.0/255.255.255.0

这将允许172.16.3.0网络的主机上任何用户访问你的telnet及ftp服务,记住在这里要放置IP地址,因
为域名比较容易受到欺骗攻击……

现在我们准备拒绝其余所有人的连接了,将下面的语句放在/etc/hosts.deny中:

ALL: ALL: /usr/bin/mailx -s "%d: connection attempt from %c" root@mydomain.com

这条指令不仅拒绝了其它所有的连接,而且能够让tcpd发送email给root——一旦有不允许的连接尝试
发生时。

现在你可能希望用syslog记录下所有的访问记录,那么在/etc/syslog.conf放进如下语句:

auth.auth.notice;auth.info /var/log/authlog

注意两段语句间的空白是tab键,否则syslog可能会不能正常工作。

Sendmail将用以cron来调用sendmail来替代。

5.6) 配置S/Key

S/Key是一个用于实现安全的一次性口令方案的软件,它根据一系列信息(包括一个秘密口令)通过MD4
处理而形成的初始钥匙,该初始钥匙再交给MD4进行处理,资助将128位的数字签名缩成64位,该64位信息
再次传给MD4函数,这个过程一直持续直到达到期望值……

开始使用S/Key时,要建立一个以/usr/local/bin/keysh为shell的帐号:
在/etc/passwd中加入

access:x:100:100:Access Account:/tmp:/usr/local/bin/keysh

并且在/etc/shadow中加入

access:NP:6445::::::

然后使用passwd access命令来设定用户的访问密码。

由于/usr/local/bin/keysh不是一个标准的shell,所以你的/etc/shells文件中内容如下:

/sbin/sh
/usr/local/bin/keysh

只有使用这两种login shell的用户才允许接入。

然后建立一个文件/etc/skeykeys并赋予一定的许可权限:

touch /etc/skeykeys
chmod 600 /etc/skeykeys
chown root /etc/skeykeys
chgrp root /etc/skeykeys

使用keyinit access命令来初始化S/Key秘密口令。

现在你可以配置允许用户通过keysu命令来成为超级用户,首先改变/etc/group:

root::0:root,access

只有在这里列出来的用户才允许通过keysu成为超级用户。现在你可以使用不着keyinit root命令来初
始化超级用户的S/Key秘密口令,我建议该口令要与user的有所区别。

本来你可以将/bin/su删掉以确定用户只能使用keysu……,但不幸的是,许多脚本使用/bin/su来开启
进程,所以你只需用chmod 500 /bin/su来改变它的权限就行了。


5.7) 配置wu-ftp

配置wu-ftp需要经验:),当你编译wu-ftpd时,你需要指定一个存放配置文件的地方,这个文件夹里将
包含一个pid文件夹和三个文件,一个ftp conversions文件可以是空的,但不能没有,还有ftpusers文
件包含了所有在password文件中存在但不允许登陆系统ftp的用户名称,也就是如uucp、bin之类的系统
帐号都将应该被限制。root最好是永远都被扔在这里面:)。

最后一个文件是ftpaccess:

class users real 172.16.3.*

log commands real
log transfers real inbound,outbound

这将允许从172.16.3.0的任何用户ftp而拒绝所有其它的,所有的文件与命令将被记录下来,并且存放
在你指定的记录文件目录。

至于建立匿名FTP,你要小心,因为很容易配置错误。

建立一个特殊帐户如:

ftp:*:400:400:Anonymous FTP:/var/spool/ftp:/bon/false

因为使用了chroot()功能,必须建立一个小的文件系统,包含了bin\etc\pub目录:

这里面要注意的有:

确保bin及etc下的所有文件属主都是root,且任何人不可写,只有执行权限,最好另外拷贝
一份passwd到ftp的etc中,即使被入侵者得到了,也不会泄露太多信息。

详细配置情况还需要看关于wu-ftp的faq。

5.8) 限制对文件及文件系统的存取权限

下载并使用fix-modes,这个程序会将系统里不安全的文件存取权限(文件/目录)找出来。

使用nosuid参数来配置/etc/vfstab,以防止setuid程序从UFS文件系统执行

/proc - /proc proc - no -
fd - /dev/fd fd - no -
swap - /tmp tmpfs - yes -
/dev/dsk/c0t3d0s1 - - swap - no -

/dev/dsk/c0t3d0s0 /dev/rdsk/c0t3d0s0 / ufs 1 no remount,nosuid
/dev/dsk/c0t3d0s4 /dev/rdsk/c0t3d0s4 /usr ufs 1 no ro
/dev/dsk/c0t3d0s5 /dev/rdsk/c0t3d0s5 /var ufs 1 no nosuid
/dev/dsk/c0t3d0s6 /dev/rdsk/c0t3d0s6 /local ufs 2 yes nosuid

5.9) 测试配置

重启你的机器,确定下面这些东西:

你可以从你配置为允许tcpd连接的机器telnet及ftp到你的server。

尝试从其它未被允许的机器进入,应该会拒绝并email告知当事人。

你只能以user的身份远程telnet或者ftp上站,不能以root登陆。

用户可以通过/usr/local/bin/keysu成为超级用户。

ps -ef只有少量的进程显示,最好不要有sendmail和各种NFS进程。

touch /usr/FOO会得到错误提示,因为文件系统是ro的。

成为超级用户,将ps命令复制到/,要保持它的setuid位,然后删除它的二进制文件。

好了,祝贺你,你已经建立了一个比较安全的系统了:)

5.10) 最后:一些建议

使用XNTP来确定精确的时间。

在你把机器放到网上前,用tripwire和MD5做一个校验,如果系统被入侵,你可以通过保存的校验和
来判断哪些程序被替换掉了。

考虑使用进程记录来记来系统里占用资源的情况。

定期改变你的S/Key secrets并且选择一个好的密码,在各地方的密码最好不要一样……

 carlous发表于: 2002/07/24 03:01pm
转3 from linux技术中坚站
Solaris的安全配置
希望对大家能有点用吧。

Solaris的安全配置可以从以下几个方面来考虑:
1. 本地安全增强
包括: 限制某些强大命令的访问
设置正确的文件权限
应用组和用户的概念
suid/sgid的文件最少
rw-rw-rw的文件最少等

2. 网络安全增强
包括: 使用安全的协议来管理
禁止所有不需要的服务
禁止系统间的信任关系
禁止不需要的帐号
增强认证需要的密码
保护存在危险的网络服务
限制访问等

3. 应用安全增强
包括: 限制用户的权限
限制进程所有者的权限
检查应用相关文件权限
限制访问其他系统资源
应用所依赖的suid/sgid文件最少
使用应用本身的安全特性
删除samples和其他无用的组件

4. 监控与警报
包括: 日志、完整性、入侵检测等一些使用工具等

下面就详细讲述具体的配置过程。


一、 操作系统配置
1. 安装
1.1 安装最新的补丁
安装patches对系统稳定和安全十分重要。
看系统中安装了那些补丁 #showrev –p
更新更安全的补丁在 http://sunsolve.sun.com

1.2 初始安装时需要创建 /var分区,/var分区是存放logfile以及系统变动文件的文件系统,因为它的易变化性,以及在系统运作过程中的不断扩大,所以不要把/var文件系统包括再root分区里,以免有恶意程序恶意扩大日志文件来dos根分区。

1.3 安装最小的系统
安装Solaris时,最好先最小化安装,然后再加上必要的软件,这样可以减小某个程序出现安全隐患的可能。

2. 打开审计功能
审计包括很多的内容,可以根据需求设置。可以参考本文档中的日志和监控部分。

3. 系统参数安全配置
3.1 OpenBoot的安全
OpenBoot是所有Sun SPARC启动PROM的固件部分,它包括关于SPARC系统如何启动的信息,以及用来检测SPARC系统硬件的内嵌命令。
注意:绝对不能让用户接触OpenBoot,能够访问OpenBoot的聪明用户可以从几乎所有的SCSI设备(外部硬盘或者CD-ROM)上启动系统,如果用户可以从他自己的媒体上启动系统,那么他将获得对系统的完全控制。OpenBoot的安全级别有3种:none、command和full。Sun系统在出厂的时候将OpneBoot安全级别设置为none,即不需要口令,所以必须要采用口令来保护系统的OpenBoot安全。

(1) 如何在Solaris中设置OpenBoot口令(作为超级用户)
# eeprom security-password
Changing PROM password:
New password:xxxxxxxx
Retype new password:xxxxxxxx

(2) 如何在OpenBoot提示符下设置OpenBoot口令
ok password
ok New password (only first 8 chars are used) :xxxxxxxx
ok Retype new password:xxxxxxxx
ok

(3) 如何在Solaris中设置OpenBoot的安全级别
下面这个例子将把安全级别设置为command(作为超级用户)
# eeprom security-mode=command
#

(4) 如何在OpenBoot提示符下设置OpenBoot安全级别
下面这个例子将把安全级别设置为command
ok setenv security-mode command
ok

下面这个例子将把安全级别设置为full
ok setenv security-mode full
ok

3.2 将coredump大小设置为0
在/etc/system中加入如下一行:
set sys:coredumpsize = 0
将每次重启产生的coredump大小设置为0,不需要无用的信息。

3.3 修正堆栈错误,防止溢出(只对2.6后有效)
黑客进入系统后大部分是利用buffer overflow取得root shell
为了防止基于堆栈的缓冲区溢出,在/etc/system文件中加入
set noexec_user_stack=1 ?防止在堆栈中执行
set noexec_user_stack_log=1 ?当某人试图运行增加一个记录。

然后改变文件权限:#chmod 644 /etc/system

3.4 只允许root进行电源管理(只对2.6及以后版本有效)
编辑/etc/default/sys-suspend:
将 PERMS=console-owner
改为 PERMS=-
并做 #/bin/chmod 0755 /usr/openwin/bin/sys-suspend
此项防止SYN Flood攻击

3.5 设置/tmp目录粘滞位,mode 1777
创建文件/etc/rc3.d/S79tmpfix:
/bin/cat << EOF >/etc/rc3.d/S79tmpfix
#!/bin/sh
#ident "@(#)tmpfix 1.0 95/09/14"
if [ -d /tmp ]
then
/usr/bin/chmod g-s /tmp
/usr/bin/chmod 1777 /tmp
/usr/bin/chgrp sys /tmp
/usr/bin/chown sys /tmp
fi
EOF
改变S79tmpfix文件权限:
#/usr/bin/chmod 755 /etc/rc3.d/S79tmpfix
此项给/tmp加上粘滞位,只允许写而不允许删除。这样,当黑客往/tmp写.socket文件时不允许删除。

3.6 禁止stop-‘A’键
在/etc/default/kbd中,改变或加入“KEYBOARD_ABORT=disable”此项防止启动后,按stop-A或L1-A得到ok提示符,使用启动盘可以进入单用户模式,防止黑客物理接触机器。但此项不禁止可以作为密码丢失时的应急处理。

3.7 密码设置配置
(1) 添加或编辑/etc/default/passwd文件如下入口:
PWMIN= 1 #密码可以被改变的最小时段。

(2) 添加或编辑/etc/default/passwd文件如下入口:
PWMAX= 13 #密码的最大生存周期。

(3) 添加或编辑/etc/default/passwd文件如下入口:
PWWARN= 4 #设定离用户密码过期的天数,当系统启动时提醒用户。

(4) 添加或编辑/etc/default/passwd文件如下入口:
PWLEN= 8 #设定最小用户密码长度为8位。

3.8 登陆的安全配置

3.8.1 防止远程的root登陆
解决方法:
添加或编辑/etc/default/login文件如下入口:
CONSOLE=/dev/console #这样root只能从/dev/console这个设备登陆。

3.8.2 纪录所有root的登陆情况
添加或编辑/etc/default/login文件如下入口:
SYSLOG= YES #syslog纪录root的登陆失败,成功的情况。

3.8.3 设置登陆会话超时时间
添加或编辑/etc/default/login文件如下入口:
TIMEOUT= 120

3.8.4 确定登陆需要密码验证
添加或编辑/etc/default/login文件如下入口:
PASSREQ= YES
参考脚本:
defloginparams.sh

3.9 设置屏蔽掩码和umask
(1)设置屏蔽掩码:
添加或编辑/etc/default/login文件如下入口:
LUMASK= 027 #这将设定标准掩码为:750,也可以将这行加到/etc/.login /etc/profile /etc/skel/local.cshrc /etc/skel/local.login /etc/skel/local.profile这些文件里。

(2)设置umask
确定root的umask是027或077
检查root的.profile

3.10 设置shell的环境变量
添加或编辑/etc/default/login文件如下入口:
ALTSHELL= YES
参考脚本:
defloginparams.sh

3.11 查是否每个用户都设置了密码
检查/etc/passwd和/etc/shadow,每个用户的密码栏是否为空。

3.12 编辑使用useradd的缺省配置,满足密码策略
编辑/etc/sadm/defadduser需要满足密码策略,例如:
defgroup=15
defgname=users
defparent=/export/home
defskel=/etc/skel
defshell=/usr/bin/ksh
definact=30
defexpire=

3.13 在所有path中,去掉所有”.”路径
检查所有缺省启动脚本和root启动脚本,在所有路径变量中删除“.”路径, 包括以下文件:
/.login
/etc/.login
/etc/default/login
/.cshrc
/etc/skel/local.cshrc
/etc/skel/local.login
/etc/skel/local.profile
/.profile
/etc/profile

3.14 使用sugroup来限制su
将可以su的用户添加到这个组,在 /etc/group中创建特殊的组sugroup,将你的管理员帐号加到这个组。

改变 /bin/su 的权限为: r-sr-sr-x 1 root sugroup
#chmod 550 /bin/su
#chmod +s /bin/su
#chown root:sugroup /bin/su
#ls -al /bin/su
-r-sr-s--- 1 root sugroup 18360 Jan 15 1998 /bin/su
#grep sugroup /etc/group
sugroup::600:root,httpadm,wspher
这样,只有sugroup组中的用户可以使用su,提升为超级用户
另外一个可行的方法是使用sudo来替代su。

4 网络安全配置
4.1 禁止所有不需要的服务
用grep -v “^#”/etc/inetd.conf命令来察看你当前没有注释的服务
# vi /etc/inetd.conf
在/etc/inetd.conf中注释掉左右不需要的服务,比如:
name、shell、login、exec、comsat、talk、rusersd、printer、finger、uucp 所有以“r”开头的服务,对必须提供的服务采用tcpwapper来保护。

4.2 编译安装Tcp wapper
安装tcpd,编辑inetd.conf中的服务为:

ftp stream tcp nowait root /usr/local/bin/tcpd in.ftpd
telnet stream tcp nowait root /usr/local/bin/tcpd in.telnetd

4.3 Tcp_Wrappers
在默认情况下,Solaris允许所有的服务请求。用Tcp_Wrappers来保护服务器的安全,使其免受外部的攻击,比想像的要简单和轻松的多。
在/etc/hosts.deny 文件中加入 ALL:ALL以禁止所有计算机访问服务器,然后在/etc/hosts.allow 文件中加入允许访问服务器的计算机。这种做法是最安全的。
Tcp_Wrappers是由两个文件控制的,它们是/etc/hosts.allow 和 /etc/hosts.deny。

第一步 编辑/etc/hosts.deny 文件
# vi /etc/hosts.deny
加入下面这些行:

ALL:ALL

这样做的目的是:所有的服务、访问位置,如果没有被明确的允许,也就是在/etc/hosts.allow 中找不到匹配的项,就是被禁止的。


第二步 编辑/etc/hosts.allow 文件
# vi /etc/hosts.allow

例:我们只希望允许同一个局域网的机器使用服务器的telnet功能,而禁止互联网上面的telnet服务请求,本地局域网由 202.39.154. 、202.39.153. 和202.39.152. 三个网段组成。在hosts.deny文件中,我们定义禁止所有机器请求所有服务: ALL:ALL。 在hosts.allow文件中,我们定义只允许局域网访问telnet功能:

in.telnetd: 202.39.154. 202.39.153. 202.39.152.

这样,当非局域网的机器请求telnet服务时,就会被拒绝。而局域网的机器可以使用telnet服务。

4.4 启动时提供的服务(rc.x)
4.4.1 禁止所有不需要的服务
在rc.x目录中将不需要的服务改名,比如:
# mv /etc/rc3.d/S92volmgt /etc/rc2.d/not_usedS92volmgt
以下服务应该禁止(根据需要自己决定):

snmpdx
autofs (Automounter)
volmgt (Volume Deamon)
lpsched (LP print service)
nscd (Name Service Cache Daemon)
Sendmail
keyserv (Keyserv Deamon is only used if NIS+ or NFS are installed, if used start with
–d option so that the defaults “nobody” key is not allowed)
rpcbind提供远程呼叫,依靠远程系统的ip地址和远程用户的ID进行验证,这样很容易伪造和改变。

4.4.2 禁止所有DMI服务
禁止所有DMI服务:
# mv /etc/rc3.d/S??dmi /etc/rc3.d/K??dmi

/etc/init.d/init.dmi中启动的dmi服务有:
/usr/lib/dmi/dmispd
/usr/lib/dmi/snmpXdmid
/etc/dmi/ciagent/ciinvoke

4.4.3 去掉mount系统的suid位
在/etc/rmmount.conf中加上:

mount hsfs -o nosuid
mount ufs -o nosuid

4.4.4 检查所有的.rhosts文件
.rhosts允许不要密码远程访问
预先生成$HOME/.rhosts文件,并且设置为0000,防止被写入”+ +”。(攻击者经常使用类似符号链接或者利用ROOTSHELL写入)。
注:这种情况会导致一些如SSH的RCP命令无法使用(需要使用$HOME/.rhosts文件的一些命令)
touch /.rhosts ;chmod 0 /.rhosts

.rhosts可以被普通用户所创建在个人目录下。推荐使用脚本来发现.rhosts文件。并且利用cron自动检查,报告给特定用户。
Script for Find.rhost:
#!/bin/sh
/usr/bin/find /home -name .rhosts | (cat < this only find .rhost:
EOF
cat
) | /bin/mailx -s "Content of .rhosts file audit report" yourmailbox

4.4.5 禁止使用.rhosts认证
在/etc/pam.conf中删除
rlogin auth sufficient /usr/lib/security/pam_rhosts_auth.so.1

将rsh的行改为:
rsh auth required /usr/lib/security/pam_unix.so.1

4.4.6 检查信任关系
检查/etc/hosts.equiv文件,确保为空。

4.5 网络接口调整和安全优化
4.5.1 /etc/rc2.d/S??inet参数调整
在/etc/rc2.d/S??inet中做如下参数调整:

缩短ARP的cache保存时间:
ndd -set /dev/arp arp_cleanup_interval 60000 /* 1 min (default is 5 min)*/

缩短ARP表中特定条目的保持时间:
ndd -set /dev/ip ip_ire_flush_interval 60000 /* 1 min (default is 20 min)*/

关闭echo广播来防止ping攻击
ndd -set /dev/ip ip_respond_to_echo_broadcast 0 # default is 1

关闭原路由寻址
ndd -set /dev/ip ip_forward_src_routed 0 # default is 1

禁止系统转发IP包
ndd -set /dev/ip ip_forwarding 0 # default is 1

禁止系统转发定向广播包
ndd -set /dev/ip ip_forward_directed_broadcasts 0 # default is 1

使系统忽略重定向IP包
ndd -set /dev/ip ip_ignore_redirect 1 # default is 0

使系统限制多宿主机
ndd -set /dev/ip ip_strict_dst_multihoming 1 # default is 0

再次确保系统关闭ICMP广播响应
ndd -set /dev/ip ip_respond_to_address_mask_broadcast=0 # default is 1

关闭系统对ICMP时戳请求的响应
ndd -set /dev/ip ip_ip_respond_to_timestamp=0 # default is 1

关闭系统对ICMP时戳广播的响应
ndd -set /dev/ip ip_ip_respond_to_timestamp_broadcast=0 # default is 1

禁止系统发送ICMP重定向包
ndd -set /dev/ip ip_send_redirects=0 # default is 1

4.5.2 改变TCP序列号产生参数
在/etc/default/inetinit中改变
TCP_STRONG_ISS=2

4.5.3 设置in.routed运行在静态路由模式
按如下步骤建立in.routed -q(静态模式):
mv /usr/sbin/in.routed /usr/sbin/in.routed.orig

创建文件/usr/sbin/in.routed为以下内容:
#! /bin/sh
/usr/sbin/in.routed.orig –q

改变文件属性:
chmod 0755 /usr/sbin/in.routed

#动态的路由模式容易遭受到恶意的路由信息的亲篇和攻击,所以建议宁愿用静态路由,(路由的增加通过启动文件的route命令)也不建议用动态路由守护进程。


4.5.4 禁止路由功能
创建空文件notrouter:
# touch /etc/notrouter

4.5.5 利用ip-filter
ip-filter是Solaris系统的内核模块,可以完成简单包过滤

二 应用程序安全配置
1. 总体安全考虑
应用程序以非特权用户运行
定义应用程序属主
删除所有的samples
chroot,改变进程的root目录
具体应用考虑

2. NFS服务
2.1 禁止nfs服务
杀掉如下NFS进程: lockd、nfsd、statd、mountd

NFS是由/etc/dfs/dfstab文件控制,为了禁止NFS服务的后台程序
将/etc/rc2.d/S15nfs.server文件改名 K15nfs.server
将/etc/rc2.d/S73nfs.client文件改名 K13nfs.client

/etc/dfs/dfstab 文件有几个选项
share –F nfs –o [rw/ro] /目录名
client端有读写权限, ro是client端只有读权限 [建议使用ro选项]

2.2 如必须使用,则设置nfs特殊tcp、udp端口

ndd -set /dev/tcp tcp_extra_priv_ports_add 2049(设置TCP端口)

ndd -set /dev/udp udp_extra_priv_ports_add 2049(设置UDP端口)

2.3 打开nfs port monitoring功能
在/etc/system中加入:

set nfssrv:nfs_portmon = 1
set nfs:nfs_portmon = 1
确定你的/etc/system文件的访问权限为644:
# chmod 644 /etc/system


2.4 一些nfs相关的服务
解决方法:
nfsd
mountd
rpc.boot
in.rarpd
rpld

3 NIS,NIS+
3.1 去除NIS,NIS+
建议不要运行NIS,NIS+服务,所以按一下步骤移除它:
在文件/etc/domainname里移除域名:
可以察看NIS大体的服务列表:
# pkginfo |grep NIS
# pkgrm
system SUNWypr NIS Server for Solaris (root)
system SUNWypu NIS Server for Solaris (usr)

3.2 移除NIS,NIS+,DNS Lookup
解决方法:
编辑/etc/nsswitch.conf如下:

passwd: files
group: files
hosts: files
networks: files
protocols: files
rpc: files
ethers: files
netmasks: files
bootparams: files
publickey: files
netgroup: files
automount: files
aliases: files
services: files
sendmailvars: files
如果需要dns的话,可以再次修改这个文件。

4 Mail
4.1 停止绑定在25端口的sendmail服务
解决方法:
禁止sendmail服务,系统用户依然可以发信。含义是:sendmail仍然安装了,只是不要作为守护进程存在,你可以在sendmail.cf文件里限制系统的用户的权限。
# mv /etc/rc2.d/S88sendmail /etc/rc2.d/not_usedS88sendmail

4.2 注释所有的并行邮件别名
解决方法:
检查 /ect/aliases |可以并列。用#号注解。

4.3 限制sendmail的expn和vrfy两个命令来收集系统信息
解决方法:
在/etc/senmmail.cf文件中修改如下限制远程连接25端口使用expn和vrfy命令:

# O PrivacyOptions=authwarnings, goaway
Opgoaway
# O PrivacyOptions=noexpn, novrfy, authwarnings
O LogLevel=5

4.4 隐藏smtp版本信息
解决方法:
在/etc/mail/sendmail.cf文件里找到smtp版本信息,修改如下:
# SMTP login message

4.5 禁止邮件转发
解决方法:
普通用户不可以选择转发者,而root可以通过/usr/local/forward/.forward.$u来控制邮件转发,修改/etc/sendmail.cf如下行:
O ForwardPath=/usr/local/forward/.forward.$u
设置/usr/local/forward正确的权限。

4.6 接收邮件
解决方法:
如果真要在系统上接收外来的邮件(监听在25端口)。建议利用spam或smtpd/smtpfwdd来保证邮件服务的安全(加上anti-spam,安全配置)。

5 Ftp安全配置
5.1 安全FTP
解决方法:
建立或修改/etc/default/ftpd文件增加屏蔽码和ftp标志信息:
UMASK= 077
BANNER="/bin/cat /etc/ftp-banner"
修改/etc/default/ftpd权限:
chmod 644 /etc/default/ftpd

5.2 建立ftp标示信息
解决方法:
建立/etc/ftp-banner文件满足如下:
例如:This system is for authorized users only. Monitoring may occur
修改/etc/ftp-banner文件的权限:
chmod 644 /etc/ftp-banner

5.3 在/etc/passwd文件中
ftp:x:30000:30000:Anonymous FTP:/ftp目录:/nosuchshell

5.4 在/etc/shadow文件中
ftp:NP:6445::::::

5.5 FTP-server的配置文件/etc/ftpaccess

class local real * ?重定义真实用户为local
class remote guest,anonymous * ?重定义匿名用户为 remote
limit local 100 Any /ftp目录/msgs/limit.local限制登录用户数
limit remote 100 Any / ftp目录/msgs/limit.remote 限制登录用户数
banner /ftp目录/msgs/msg.banner
loginfails 2 重试次数
readme README* login
readme README* cwd=*
message /ftp目录/msgs/welcome.msg login local remote
message /ftp目录/msgs/cwd.msg cwd=* remote
compress yes local,remote
tar yes remote,local
log commands real
log transfers anonymous,real,guest inbound,outbound
shutdown /ftp目录/msgs/shutmsg

5.6 创建ftp banner
创建Banner文件 /etc/ftp-banner

5.7 创建/etc/ftpusers文件
把所有的系统账户加入到这个文件里:
root daemon sys bin adm lp smtp uucp nuucp listen
nobody noaccess news ingres audit admin sync nobody4

修改/etc/ftpuser文件的权限:
# chmod 644 /etc/ftpusers

6 Telnet安全配置
6.1 防止telnet程序显示系统版本信息
解决方法:
移除/etc/default/telnetd文件里的信息:Banner=””

假如/etc/default/telnetd文件不存在,按如下步骤操作:
# touch /etc/default/telnetd
# echo "BANNER=\"\"">> /etc/default/telnetd
# chmod 444 /etc/default/telnetd

6.2 最好采用SSH代替Telnet

7 X-Windows
设置CDE为不接受任何XDMCP登陆连接
假如/usr/dt/config/Xaccess存在,则如下操作:
cat </usr/dt/config/Xaccess
# disable all XDMCP connections
!*
EOF
假如/etc/dt/config/Xaccess存在,则如下操作:
cat </etc/dt/config/Xaccess
# disable all XDMCP connections
!*
EOF

三 文件权限
1 删除所有不使用的suid文件
列出系统中所有 suid 文件
find / -type f \( -perm -4000 \) –exec ls –al {} \;
find / -type f \( -perm -4000 \) –exec ls –al {} \; > $HOME/search-4-suid-files.txt

首先备份 suid 文件
# mkdir /opt/backup/suid
find / -type f \( -perm -4000 \) -print |cpio -pudm /opt/backup/suid
删除前建立tar备份,不要删除suid-files.tar!!
cd /opt/backup; tar –cvpf suid-files.tar /opt/backup/suid/*
rm –r /opt/backup/suid
去除所有suid 文件中的suid 位

find / -type f \( -perm -4000 \) –exec chmod –s {} \;
再查一遍
find / -type f \( -perm –4000 \) –exec ls –al {} \;
对一些常用文件建立suid 位
chmod u+s /usr/bin/su
chmod u+s /usr/bin/passwd
chmod u+s /usr/bin/ps

2 删除所有不使用的sgid文件
列出系统中所有 suid 文件
find / -type f \( -perm -2000 \) –exec ls –al {} \;
find / -type f \( -perm -2000 \) –exec ls –al {} \; > $HOME/search-4-sgid-files.txt

首先备份 sgid 文件:
mkdir /opt/backup/sgid
find / -type f \( -perm -2000 \) -print |cpio -pudm /opt/backup/sgid
删除前建立tar备份,不要删除sgid-files.tar!!
cd /opt/backup; tar –cvpf sgid-files.tar /opt/backup/sgid/*
rm –r /opt/backup/sgid
去除所有sgid 文件中的sgid 位

find / -type f \( -perm -2000 \) –exec chmod –s {} \;
再查一遍
find / -type f \( -perm –2000 \) –exec ls –al {} \;
对一些常用文件建立sgid 位。

3 删除/etc下所有组可写文件
find /etc -type f \( -perm -20 \) –exec ls –al {} \;
find /etc -type f \( -perm -20 \) –exec ls –al {} \; > search-4-group-writeable-in-etc.txt
/etc下不应有组可写文件,去掉写权限
find /etc -type f \( -perm –20 \) –exec chmod g-w {} \;

4 删除/etc下所有用户可写文件
检查/etc目录下对用户可写文件:
find /etc -type f\( -perm 2 \) | xargs ls –las
不需要用户的可写权限,修改如下:
find /etc -type f\( -perm 2 \) | xargs chmod g-w

5 改变所有文件的rw-rw-rw权限为rw-r-r-
首先列出文件:
find / -type f -perm 666 |xargs ls -al > perm-666-before-change.txt
改变权限:
find / -type f -perm 666 |xargs chmod 644
find / -type f -perm 666 |xargs ls -al > perm-666-after-change.txt

6 改变rwxrwxrwx文件的权限
首先列出文件:
find / -type f -perm 777 |xargs ls -al > perm-777-before-change.txt
改变权限:
find / -type f -perm 777 |xargs chmod 755
find / -type f -perm 777 |xargs ls -al > perm-777-after-change.txt

7 找出系统可写的目录
解决方法:
find / -type d\( -perm 2 \)
改变所需要的权限设置

8 确定每个root启动的脚本属于root
检查启动脚本的文件属主:

find /etc -type f -print | grep rc | egrep -v "skel|tty|mail|snmp|Mail" | xargs ls -al > rc-files-before-change.txt

改变这些文件的文件属主:
find /etc -type f -print | grep rc | egrep -v "skel|tty|mail|snmp|Mail" | xargs chown
root:root

find /etc -type f -print | grep rc | egrep -v "skel|tty|mail|snmp|Mail" | xargs ls -al > rc-files-after-change.txt

ls -al /etc/init.d > etc-init.d-before.change.txt

chown root:root /etc/init.d

ls -al /etc/init.d > etc-init.d-after-change.txt

经过这样的改变,所有的rcX.d里的脚本的文件属主都为root,所有的/etc/init.d目录里的脚本的文件属主文件组都是root了,为了防止特洛伊木马。

9 确保所有cron行为有记录
确定/etc/default/cron文件里有如下行:
CRONLOG=YES
删除/var/spool/cron/crontabs 目录中除了root文件外所有文件。

10 检查utmp,utmpx的权限
检查/var/adm目录下的文件权限:
find /var/adm -type f\( -perm 2 \) | xargs ls -las
修改文件:
chmod 644 /var/adm/utmp

11 查找无用户文件
1) find / -type f -nouser > files-nouser-before-change
2) find / -type f -nouser | xargs chwon nobody:nobody
3) find / -type f -nouser > files-nouser-after-change

12 查找无组文件
1) find / -type f -nogroup > files-nogroup-before-change
2) find / -type f -nogroup | xargs chgrp nobody
3) find / -type f -nogroup > files-nogroup-after-change

13 改变/var/cron权限
chmod 700 /var/cron && chown root /var/cron && chgrp sys /var/cron

四 日志和监控
1 将cron logfiles的大小设为2M
修改/etc/cron.d/logchecker如下:
LIMIT=4096

2 记录所有inetd服务
修改/etc/init.d/inetsvc文件如下:
/usr/sbin/ifconfig -au netmask + broadcast +
/usr/ bin/inetd -s –t
假如你运行了named,dhcpd, multicast,你必须作如上改动。

3 修改syslog.conf文件
编辑syslog.conf,增加
*.debug /var/adm/compass.messages #记录debug信息

4 创建/var/adm/loginlog来记录登陆失败信息
touch /var/adm/loginlog
chmod 600 /var/adm/loginlog
chown root /var/adm/loginlog
chgrp sys /var/adm/loginlog

五 其他安全建议
1 安装tripwire
tripwire是一个特洛伊木马检查程序,他工作在提供的二进制文件的md5码的数据库以及你的配置上,建议每6个小时运行一次tripwire。

2 IDS
建议安装运行snort工具来监测你的网络可能收到的如下攻击:
- cgi-scan
- portscans
- virus
根据你的需要参看/root/config/snort.rules文件。

3 日志文件观察者(swatch)
建议安装运行swatch工具来监测你的日志文件,你可以在你的系统上启动多个监测进程,例如:
- /var/adm/compass.messages
- /var /adm/snort_portscan.log
- /opt/AppServer/WebSphere/log/????
Swatch是一个用perl写的工具,所以你必须安装PERL MODULES。

4 设置启动标示
创建/etc/issue文件,添加需要的启动标示。

 carlous发表于: 2002/07/24 03:04pm
转4sun solaris系统管理员管理安全手册
http://www.cn105.com janenly

1,Preparation 2,Initial OS installation 3,Stripping/configuring OS: 1st pass 4,Connect to test network 5,Installing tools & sysadmin software 6,Stripping/configuring OS: 2nd pass 7,Create Tripwire image, backup, test 8,Install, test, harden applications. 9,Install on live network, test
1. Preparation 最小限度保证安全的方法是只在主机上运行一个或两个服务。使用一个机器比只使用一个拥有所有权利的机器安全的多,因为这样可以隔离,方便查找问题所在。总之:在你的机器上运行你一些最必要的服务。考虑拆除键盘,屏幕,这样可以避免使用X11和知道命令行所示,在一个隔离的信任的网络段中进行测试。明确你的系统和硬件配置能产生什么样的结果,如在安装SUN的Disksuite时要考虑你是否需要RPC服务,因为DISKSUITE必须使用RPC服务。明确各种应用程序是怎样工作的如:使用什么端口和文件. 2,初始化安装操作系统。连接串口控制台,开机,当出现OK提示时发送Stop-A信息(~#,~%b,或者F5,主要取决于你使用tip,cu或者vt100终端),然后开始安装过程- “boot cdrom - install“ 使用最小安装 end user bundle(除非你要额外的server/developer工具),设置主机名,终端,IP参数,时区等等,不要激活NIS或者NFS及不要激活电源管理。选择手工划分分区:把/usr和/opt和ROOT分离开来以便这些分区可以以只读方式挂(mount)起来。考虑把大的/var文件系统和拥有较多的数据量如(web,ftp)划分为独立的分区。如果硬盘是2GB建议200MB / (+var), 200MB swap, 600MB /usr及 1GB 给 /opt 如果硬盘是2GB建议300MB / (+var+opt), 200MB swap, 500MB /usr 给ROOT设置一个7到8字符大小写结合等比较强壮的密码,再重启动。接着安全由SUN的安全补丁。一般的在CD上就包含这些安全补丁包。重启动及作为 ROOT重启动后,你可以使用showrev -p查看补丁列表。 3,配置操作系统磁盘共享(mount):为了减少木马和不授权的修改,在/etc/vfstab,在mount /时请使用“remount,nosuid“选项;在/var上请带上“nosuid“选项;在/tmp后加上 “size=100m,nosuid“选项(允许/tmp只能使用100M空间及不允许执行SUID程序);如果软盘不需要的话再把“/dev/fd“行注释掉。 (下面的命令假定你使用的是c-shell) 使NFS无效: rm /etc/rc2.d/{S73nfs.client,K28nfs.server} /etc/rc3.d/S15nfs.server /etc/dfs/dfstab 使Sendmail守护程序无效,虽然sendmail不是作为一个守护程序来运行的,但两进制程序是依然存在的,EMAIL还可以通过它了发送(但不能接受)。设定只要一个主机来接受EMAIL,另必须使用smap或其他等同命令来把sendmail危险程度降低到最底。 rm /etc/rc2.d/S88sendmail 再在cron行中增加处理邮件队列的命令: 0 * * * * /usr/lib/sendmail -q 在关闭一些其他的服务: rm /etc/rc2.d/{S74autofs,S30sysid.net,S71sysid.sys,S72autoinstall} rm /etc/rc2.d/{S93cacheos.finish,S73cachefs.daemon,S80PRESERVE} rm /etc/rc2.d/{S85power,K07dmi} rm /etc/rc3.d/S77dmi If you have server/developer packages: rm /etc/rc2.d/{S47asppp,S89bdconfig,S70uucp} 使RPC无效:这一般来说是建议关闭此功能的,但一些程序如DISKSUITE会开启RPC服务,所以一般建议不使用DISKSUITE工具。如果你不想使RPC无效,则一定要使用信息包过滤器。 rm /etc/rc2.d/S71rpc 使打印服务无效(除非有一个本地打印机存在): rm /etc/rc2.d/{S80lp,S80spc} 使naming Services Caching Daemon(名字服务缓冲守护程序)服务无效: mv /etc/rc2.d/S76nscd /etc/rc2.d/.S76nscd 使CDE程序无效(除非你坚持要使用图形控制台): rm /etc/rc2.d/S99dtlogin 使NTP-NETWORK TIME PROTOCOL无效(NTP会增加带宽和不安全的因素,建议使用 rdate到一台使用NTP的机器来获得精确时间): rm /etc/rc2.d/S74xntpd 使SNMP无效: rm /etc/rc2.d/K07snmpdx /etc/rc3.d/S76snmpdx 在Inetinit中是IP forwarding和sourec routing(源路)由无效(假如有超过一个网络接口的话)。在/etc/init.d/inetinit中增加下面所示设置: ndd -set /dev/ip ip_forward_directed_broadcasts 0 ndd -set /dev/ip ip_forward_src_routed 0 ndd -set /dev/ip ip_forwarding 0 根据RFC1948建议在/etc/default/inetinit中增加如下的生成初始化序列号设置来防止TCP序列号预测攻击(ip欺骗): TCP_STRONG_ISS=2 在/etc/system中增加如下设置来防止某些缓冲溢出攻击。这些保护是那些需在堆栈中执行的攻击方式。但需要硬件的支持(只在sun4u/sun4d/sun4m系统中有效): set noexec_user_stack=1 set noexec_user_stack_log=1 使用默认路由:在/etc/defaultrouter中增加IP地址,或使用“route“在 /etc/rc2.d/S99static_routes中建立启动文件。为了使动态路由无效: touch /etc/notrouter 为了使多路广播(multicasting)无效请在/etc/init.d/inetsvc中注解掉 “route add 224.0.0.0“周围的几行。为了记录INETD连接的所有信息,在inetd低端的启动行中增加“-t“参数,即:: /usr/sbin/inetd -s -t 在/etc/hosts中配置一些你想取舍的主机(一些你不想通过DNS解析的)。 /etc/inetd.conf: 先使所有服务无效;配置你真正需要的服务,但必须使用FWTK netacl或tcp wrappers来允许最小限度的IP地址访问和各种记录 4,连接并测试网络系统通过上面的安全剥离和筛选,你必须肯定系统能正常工作,把它连接到一个安全隔离的网络。重起并以ROOT身份登录控制台,检查控制台启动时的错误信息并根据需要进行修改。 5,安装系统管理工具软件这部分将安装标准的工具和实用程序。最重要的是SSH,这些工具必须在其他机器上编译和精心测试过的。环境: DNS客户端:在/etc/resolv.conf中增加域名和DNS服务;在/etc/nsswitch.conf 中增加DNS入口的主机。 EMAIL:如果主机不需要在子网外发送EMAIL,就不需要使用mailhost的别名。否则的话必须编辑/etc/mail/aliases,在/etc/hosts中设置mailhost,在 /etc/mail/sendmail.cf取消Dj行的注释并把它设置为Dj$w.YOURDOMAIN.COM. 如果DNS没有配置,就在 /etc/hosts中增加这太机器的别名 hostname.YOURDOMAIN.COM。现在发送一封测试EMAIL:mailx -v -s test_email root 为LOGIN登录进程安装SSH。配置SSH守护程序(/etc/sshd_config)以便访问限制在带有known public keys的主机(/etc/ssh_known_hosts)并使rhosts认证无效。如果远程管理确实需要的话,使用.shosts要比.rhosts好的多。检查Inetd中的telnetd/ftpd是否仍然激活,如果是的话请在/etc/inetd.conf中注释掉,在进行SSH测试。

安装一些其他的一些必须工具如:gzip;traceroute;top(不带SUID);lsof.

安装和建立Perl5到/bin/perl.

在/secure中安装安全脚本如:rotate_cron, rotate_log, wtrim.pl, rdistd 并改变属性来保护/secure:chmod -R 700 /secure; chown -R root /secure 6,在次配置和筛选系统安全:许多在CD中OS的补丁是不够及时的,因此从sunsolve.sun.ch中获取patchdiag 工具来查看安全补丁并下载安装这些补丁。

配置登录记录 在/etc/default/su中使SU记录有效。使用以下方法使尝试登录失败记录有效: touch /var/log/loginlog; chmod 600 /var/log/loginlog; chgrp sys /var/log/loginlog

SYSLOG记录:根据syslog.conf例子来分散LOG分析记录,即把多项服务的记录分散到各个独立的LOG文件,有条件的话在(/etc/hosts)中指定一台机器作为loghost

syslog “loghost“ 需要一个大的磁盘作为LOG记录的存储介质。建立空的LOGS文件并设立相应的权限:

cd /var/log; touch daemonlog authlog kernlog userlog maillog lprlog cronlog newslog locallog alertlog;

chmod 600 daemonlog authlog kernlog userlog maillog lprlog cronlog newslog locallog alertlog;

kill -1 `pgrep syslogd`

使用rotate_log来修剪和压缩LOGS文件,在root cron中增加如下条目: ## Prune syslog logs weekly, keeping the last 6 months or so: 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 40 alertlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 40 authlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 20 cronlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 40 daemonlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 40 kernlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 40 locallog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 20 newslog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 40 userlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 10 lprlog 55 23 * * 6 /secure/rotate_log -L /var/log -c -m 600 -M 400 -c -s -n 20 maillog # Reset syslog daemon 0,15,30 0 * * 0 kill -HUP `cat /etc/syslog.pid`

为了你自己使用上面的条目请在root cron中使其他的log修剪(pruning)无效: #10 3 * * 0,4 /etc/cron.d/logchecker #10 3 * * 0 /usr/lib/newsyslog #15 3 * * 0 /usr/lib/fs/nfs/nfsfind #1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 #30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean

Pruning of login & other logs:

## Empty login/logout records at year end 0 0 31 12 * /secure/wtrim.pl wtmp 0 0 31 12 * /secure/wtrim.pl wtmpx 20 # Solaris 2.x logs: 0 4 * * 6 /secure/rotate_log -L /var/adm -c -m 640 -M 440 -c -s -n 30 loginlog 0 4 * * 6 /secure/rotate_log -L /var/adm -c -m 640 -M 440 -c -s -n 30 sulog 0 4 * * 6 /secure/rotate_log -L /var/adm -c -m 640 -M 440 -c -s -n 2 vold.log 0 4 * * 6 /secure/rotate_cron

crons

删除不需要的crons:rm /var/spool/cron/crontabs/{lp,sys,adm}

Root cron 条目:通过可信赖的来源使用rdate设定日期(你或许使用NTP协议,这将使时间精确一些,但正向上面所说的增加带宽和不必要的安全问题): ## Synchronise the time(同步时间): 0 * * * * /usr/bin/rdate YOURTIMEHOST >/dev/null 2>&1

文件权限必须限制一些有关ROOT操作的权限或干脆使其无效: chmod 0500 /usr/sbin/snoop /usr/sbin/devinfo chmod o-r /var/spool/cron/crontabs/* chmod 000 /bin/rdist chmod o-rx /etc/security chmod og-rwx /var/adm/vold.log chmod u-s /usr/lib/sendmail #Except for mailgateways chmod 400 /.shosts /etc/sshd_config /etc/ssh_known_hosts

再在登录信息上设置警告用户非授权登录的信息(如果要起诉侵入者你就需要这些信息)。如在Telnet和SSH,在/etc/motd中设置警告语句: ATTENTION: You have logged onto a secured XXXX Corporation server. Access by non YYYY administrators is forbidden. For info contact YYYY@XXX.com

重新启动,通过SSH登录,现在使用ps -e来显示进程列表: PID TTY TIME CMD 0 ? 0:00 sched 1 ? 0:00 init 2 ? 0:00 pageout 3 ? 0:09 fsflush 156 ? 0:00 ttymon 152 ? 0:00 sac 447 ? 0:06 sshd 88 ? 0:00 inetd 98 ? 0:00 cron 136 ? 0:00 utmpd 605 ? 0:00 syslogd 175 console 0:00 ttymon 469 pts/1 0:00 csh 466 ? 0:01 sshd 625 pts/1 0:00 ps 及使用netstat -a 将显示最小的网络连接(如只有SSH): UDP Local Address Remote Address State -------------------- -------------------- ------- *.syslog Idle *.* Unbound

TCP Local Address Remote Address Swind Send-Q Rwind Recv-Q State -------------------- -------------------- ----- ------ ----- ------ ------- *.* *.* 0 0 0 0 IDLE *.22 *.* 0 0 0 0 LISTEN *.* *.* 0 0 0 0 IDLE

7,建立Tripwire映象,备份和测试 -测试 SSH和标准工具是否能正常工作?检查LOG条目,检查控制台信息来了解系统是否按照你设想的计划实现。 -当所有工作运行的正常时,就freeze(冻结)/usr有可能的话冻结/opt: 在/etc/vfstab中增加“ro“选项以只读方式挂上(mount)/usr和/opt分区,这样减少木马程序和非认证的修改。以nosuid方式mount其他分区。重启 -如果CD-ROMS不需要的话,是卷管理无效,使用如下命令可以在你需要时重新启用:

mv /etc/rc2.d/S92volmgt /etc/rc2.d/.S92volmgt -最后安全TRIPWIRE(或者其他使用hashing算法的文件检查工具),初始化它的数据库和运行常规的检查来检测文件的改变。如果可能的话使TRIPWIRE的数据库安装在另一个机器上或一次性写入介质。如果还需要更安全的措施,那么就拷贝 TRIPWIRE和它的数据库并使用SSH远程运行。这将使入侵者很难知道TRIPWIRE在使用。

8,安装,测试应用程序应该考虑把应用程序安装在独立的分区或者在/opt分区,如果使用/opt,在安装时必须以读写方式来挂起此分区,在安装和测试后必须再设置回只读方式。根据服务器的功能,选择你所需要的如:ftpd,BIND,proxies等等,在安装应用程序时遵照以下的规则来安装: --在应用程序启动之前umask是否设置好如(如:022) --应用程序是不是能以非ROOT身份运行?是否很好的设置密码若最少8位加标点,字符大小写 --注意是否所有文件的权限设置正确,即是不是只能有应用程序用户自己拥有读写权限,有没有全局能读写的文件 --当应用程序在写LOG记录时是否安全?有没有可能把密码写到安装LOG中去 (不用感到好笑,这很普遍) 下面是一些安装常用服务所需要的安全问题 1,FTP服务(ftp) -如果你使用Western University wu-ftpd,必须知道它存在一些历史BUG,如 (请参看 CERT advisories CA-93:06, CA-94:07, CA-95:16 and Auscert AA-97.03 and AA-1999.02),最起码使用V2.6.0或以后的版本。 2,配置/etc/ftpusers的系统帐号使其不能用来FTP,如使以ROOT身份登录FTP 无效,把“root“增加到/etc/ftpusers.要想把所有系统帐号加入到你的新系统中去可使用如下方法: awk -F: ‘{print $1}‘ /etc/passwd > /etc/ftpusers -FTP可以通过/etc/ftpusers选择性的激活每个用户;也可以使用下面的方法:对于那些不能通过FTP访问此机器的,提供他们一些不正规的SHELL(如BASH 和TCSH),但不把新的SHELL加入到/etc/shells,这样FTP访问将被拒绝。相反,要把一个非标准的SHELL加入到/etc/shells才能使FTP正常工作。 -使LOGGING有效:把“-l“选项增加到/etc/inetd.conf中去,另外“-d“选项将增加 debug输出。 -FTP可以限制IP地址或基于tcp wrappers的主机名。 -如果需要匿名FTP访问,必须非常谨慎,一个chroot的环境是必须的。具体请参看in.ftpd 手册。避免允许上传文件权利。如果需要上传文件的权利,需不允许下载上载了的文件,隐藏上载文件名及不允许他们覆盖方式操作。 -使用FTP强烈建议使用chroot. -把FTP数据放在独立的磁盘分区,以nosuid方式mount。 2,DNS服务: -使用最新的BIND(Berkeley Internet Name Server)来代替SUN的named, BIND有很多好的特征,若容易DEBUG和当有安全问题发现时很快更新。具体请参看网站: www.isc.org/view.cgi?/products/BIND/index.phtml. -使用8.1.2或以后的版本 -使用测试工具www.uniplus.ch/direct/testtool/dnstest.html来测试DNS。 -使用nslookup和dig来检查服务结果。 -如果在DNS客户端存在问题检查/etc/nsswitch.conf和/etc/resolv.conf,使用nslookup -d2来获得DEBUG的信息。尝试杀掉nscd守护程序。 -如果服务器端有问题使用named -d来读console LOG,一般这LOG在syslog 文件中的“daemon“段。 -要获得name服务的统计使用 kill -ABRT `cat /etc/named.pid` 将会把统计信息记录到/usr/tmp/named.stats. -要查看改变设置后的配置信息使用HUP信号 kill -HUP `cat /etc/named.pid` 更多的请参看www.ebsinc.com/solaris/dns.html 3,有关chroot环境请参看如下网站: www.sunworld.com/swol-01-1999/swol-01-security.html

以下准备正式运行系统如果可能请使用多人进行最后测试,以便忘记某些重要的东西。使用网络漏洞扫描器扫描系统,保证只有你想使用的服务在运行。如商用扫描器IIS和免费扫描 器nmap或Satan. 检查/opt和/usr分区是否为只读状态。初始化Tripwire(或等同的检查工具) 最后测试什么在工作,什么是禁止的,检查console/log条目,开始时经常查看LOG记录。 9,系统正式运行详细检查;使用不同的人以不同的观点及在不同的网络点登录测试应用软件。 10,常规维护

下面是根据你系统的重要程度决定你要每小时,每天,每星期,每个月要做的事情: -检查SUN公司的pathdiag来不断升级系统,特别注意系统内核的补丁。 -检查所有错误和不寻常的活动记录: syslog (/var/adm/messages or /var/log/*, depending on syslog.conf), /var/cron/log, last, /var/adm/sulog, /var/adm/loginlog, application/server logs. -运行tripwire -注意一些新的漏洞及安全建议,订阅CERT,CIAC的安全公告和供应商的安全列表如(Sun, Microsoft)

其他附加信息: Free Tools SSH notes: www.boran.com/security/ssh_stuff.html TCP Wrappers www.cert.org/ftp/tools/tcp_wrappers SMAP & FWTK www.fwtk.org Top, gzip, lsof, traceroute, perl: www.sunfreeware.com Rdist www.magnicomp.com/rdist/rdist.shtml Sample tools for analysing logs: Logcheck www.psionic.com/abacus/logcheck Swatch ftp://ftp.stanford.edu/general/security-tools/swatch

Security Portal Research Centre: Firewall products www.securityportal.com/research/center.cgi?Category=firewalls Firewall white papers www.securityportal.com/research/center.cgi?Category=whitefaqfire Tripwire: Commercial Version www.tripwiresecurity.com (starts at $495.-/server) Free version V1.2 www.cert.org/ftp/tools/tripwire (last updated in 1994). Sunworld security columns www.sunworld.com/sunworldonline/common/swol-backissues-columns.html Padded Cells: www.sunworld.com/swol-01-1999/swol-01-security.html