出处:http://www.xxlinux.com/linux/article/unix/rumen/2006-06-25/2116.html
一、帐号和口令安全策略 1.1更改口令文件、影像文件、组文件的权限
/etc/passwd 必须所有用户都可读,root用户可写 –rw-r—r—
/etc/shadow 只有root可读 –r--------
/etc/group 必须所有用户都可读,root用户可写 –rw-r—r—
1.2修改不必要的系统帐号
移去或者锁定那些系统帐号,比如sys、uucp、nuucp、listen、lp、adm等等,简单的办法是在 /etc/shadow的password域中放上NP字符。还可以考虑将/etc/passwd文件中的shell域设置成 /bin/false
1.3修改口令策略
修改/etc/default/passwd文件
MAXWEEKS=4 口令至少每隔4星期更改一次
MINWEEKS=1 口令至多每隔1星期更改一次
WARNWEEKS=3 修改口令后第三个星期会收到快要修改口令的信息 PASSLENGTH=6 用户口令长度不少于6个字符
二、用户授权安全策略 2.1移去组及其它用户对/etc的写权限。
执行命令#chmod -R go-w /etc
2.2禁止root远程登录
在/etc/default/login中设置
CONSOLE=/dev/concle
2.3setuid和setgid特殊权限。
Setuid 是指设置程序的有效执行用户身份(uid)为该文件的属主,而不是调用该程序进程的用户身份。Setgid与之类似。Setuid和setgid用1s -1显示出来为s权限,存在于主人和属组的执行权限的位置上。系统设置特殊权限,使用户执行某些命令时,具有root的执行权限, 命令执行完成, root身份也随之消失。因此特殊权限关系系统的安全,可执行命令#find / -perm -4000 -print 寻找系统中具有setuid 权限的文件,存为列表文件,定时检查有没有这之外的文件被设置了setuid权限。
2.4审计并日志所有以root身份的登陆情况
添加或编辑/etc/default/login文件如下:
SYSLOG= YES
syslog记录root的登陆失败,成功的情况。
2.5设置远程登陆会话超时时间
添加或编辑/etc/default/login文件如下:
TIMEOUT= 300
2.6确定登陆需要密码验证
添加或编辑/etc/default/login文件如下:
PASSREQ= YES
2.7 UMASK设置
umask命令设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入.profile文件,就可控制该用户后续所建文件的存取许可.umask命令与chmod命令的作用正好相反,它告诉系统在创建文件时不给予什么存取许可.
安装配置完操作系统之后确认root的umask设置是077或者027,执行
/usr/bin/umask [-S] 确认。
2.7.1增加或修改/etc/default/login文件中如下行
UMASK=027
2.7.2并增加上行到如下的文件中:
/etc/.login /etc/.profile /etc/skel/local.cshre
/etc/skel/local.login /etc/skel/local.profile
2.8用户环境配置文件的PATH或者LD_LIBRARY_PATH中移去“.” 。
从如下的文件中移走”.”,确认root的PATH环境变量设置是安全的,应该只包含/usr/bin: /sbin:/usr/sbin,避免当前工作目录.出现在PATH环境变量中,这有助于对抗特洛伊木马。
#echo $PATH | grep ":." 确认
/.login /etc/.login /etc/default/login
/.cshrc /etc/skel/local.profile /etc/skel/local.cshrc
/.profile /etc/skel/local.login /etc/profile
三、网络与服务安全策略 3.1关闭不用的服务
3.1.1在inetd.conf中关闭不用的服务
首先复制/etc/inet/inetd.conf。 #cp /etc/inet/inetd.conf /etc/inet/inetd.conf.backup然后用vi编辑器编辑 inetd.conf文件,对于需要注释掉的服务在相应行开头标记“#”字符即可。
3.1.2在Services中关闭不用的服务
首先复制/etc/inet/services。 #cp /etc/inet/services /etc/inet/services.backup
然后用vi编辑器编辑Services文件,对于需要注释掉的服务在相应行开头标记“#”字符即可。
在inetd.conf、services中进行修改后,找到inetd进程的ID号,用kill向其发送HUP信号进行刷新。举例如下。
#ps -ef | grep inetd
#kill -HUP 进程号 或/usr/sbin/inetd –s –t
增加-t选项以加强网络访问控制
3.1.3根据需要关闭不用的服务
可关闭如下服务:tftp、ypupdate(NIS程序)、 dtspcd(邮件收发程序) 、rquotad、name、uucp(网络实用系统)、snmp(简单网络管理协议)等。
3.2关闭系统的自启动服务
在系统/etc/rc*.d的目录下,根据需要停用以下服务:
sendmail 把/etc/rc2.d/S88sendmai更名为tc/rc2.d/X88sendmail
DNS 将/etc/rc2.d/S72inetsv注释掉in.named一项
lp 把/etc/rc2.d/S80lp更名为 /etc/rc2.d/X80lp
uucp 把/etc/rc2.d/S70uucp更名为/etc/rc2.d/x70uucp
snmp把/etc/rc3.d/S76snmpdx和 /etc/rc3.d/S77dmi 更名 为/etc/rc3.d/s76snmpdx和 /etc/rc3.d/s77dmi
autoinstall 把/etc/rc2.d/S72autoinstallg更名为/etc/rc2.d/s72autoinstall
3.3加强FTP服务安全
3.3.1禁止系统用户的FTP服务
把所有的系统账户加入到/etc/ftpusers(solaris 9的该文件现更改为/etc/ftpd/ftpusers)文件:
root 、daemon、sys、bin、adm、lp、uucp、nuucp、listen、nobody
3.3.2禁止FTP&服务暴露系统敏感信息
编辑/etc/default/ftpd文件,假如文件不存在就新建一个,在文件中的加进入下一项: BANNER=XXXX(XXXX可以任意改变为任何一个版本信息),将该系统版本信息屏蔽.
3.3.3ftp服务会话日志记录
/etc/inet/inetd.conf中的ftpd为(记录)
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd –dl
3.4加强Telnet服务安全
3.4.1禁止Telnet服务暴露系统敏感信息
防止telnetd banner泄露信息 ,修改/etc/default/telnetd 文件 ,加入以下一项:BANNER=XXXX(XXXX可以任意改变为任何一个版本信息),将该系统版本信息屏蔽.
3.4.2更改Telnet服务端口号
修改文件/etc/services的Telnet一项,将端口号改为非23,使用Telnet服务时需注明端口号。
3.5加强NFS服务安全
检查/etc/dfs/dfstab文件share语句,缺省时共享目录为可读可写,加入“-o”选项增加安全,“-o rw”可读可写,“-o ro”只读,可授权某系统和某用户。
3.6防止TCP序列号预测攻击(ip欺骗)
在/etc/default/inetinit中增加设置来防止TCP序列号预测攻击(ip欺骗)TCP_STRONG_ISS=2
3.7系统路由安全
如果Solaris机器有超过一块的网卡的话,它将会在不同网卡间转发数据包,这一行为可以在/etc/init.d/inetinit中得到控制。要在 Solaris 2.4或者更低版本机器下关闭它,可以将ndd -set /dev/ip ip_forwarding 0添加于在inetinit文件未尾。在Solaris 2.5以上,只要touch /etc/notrouter.网络系统用静态路由比较安全。
3.8调整网络参数,加强网络安全
使IP forwarding和sourec routing(源路)由无效
在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
禁止系统转发IP包:#ndd -set /dev/ip ip_forwarding 0
缩短ARP的cache保存时间: (default is 5 min)
#ndd -set /dev/arp arp_cleanup_interval 2 min
关闭echo广播来防止ping攻击( # default is 1 )
#ndd -set /dev/ip ip_respond_to_echo_broadcast 0
四、防止堆栈缓冲益出安全策略 入侵者常常使用的一种利用系统漏洞的方式是堆栈溢出,他们在堆栈里巧妙地插入一段代码,利用它们的溢出来执行,以获得对系统的某种权限。要让你的系统在堆栈缓冲溢出攻击中更不易受侵害,你可以在/etc/system里加上如下语句:set noexec_user_stack=1
set noexec_user_stack_log =1
第一句可以防止在堆栈中执行插入的代码,第二句则是在入侵者想运行exploit的时候会做记录。
五、日志系统安全策略 5.1定时检查系统日志文件
Solaris 系统通过syslogd进程运行日志系统,配置文件/etc/syslog.conf,可编辑此文件让日志系统记录更多信息,需重启 /usr/sbin/syslogd进程,重读取配置文件。通常日志系统的文件分别存放在两个位置,/var/adm保存本地系统日志,/var/log 保存登录其它系统时日志。
5.2设置utmpx和wtmpx文件权限,确保日志系统安全。
文件/var/adm/utmpx记录了所有当前登录到系统中的用户,文件/var/adm/wtmpx记录了系统所有的登录和注销。这两个文件是以数据库的格式存在的。
设置权限#chmod 544 /var/adm/utmpx
#chmod 544 /var/adm/wtmpx
六、其它系统安全设置
6.1 crontab命令
6.1.1不要使用crontab –e命令,因为它会在/tmp下建立所有用户都可读的crontab副本访问cron系统。用如下的方法:
编辑文件:mycronfile
crontab<mycronfile
6.1.2在/etc/default/cron文件中增加如下行: CRONLOG=YES 记录所有的crontab行为
6.2对su的纪录
创建/etc/default/su文件
SULOG=/var/adm/sulog
SYSLOG=YES
CONSOLE=/dev/console
PATH=/usr/bin:
SUPATH=/usr/sbin:/usr/bin
6.3为OpenBoot设置密码
在Solaris中设置密码
#eeprom security-password
在OpenBoot中设置密码
ok password
在Solaris中设置安全级别(command)
#eeprom security-mode=command
在OpenBoot中设置安全级别(command)
ok setenv security-mode command
在OpenBoot中设置安全级别(full)
ok setenv security-mode full
6.4限制.rhosts和/etc/hosts.equiv文件的使用
配置文件具有两种功能:r系列命令使用这些文件来访问系统;在某用户的目录下存在.rhosts文件或/etc/hosts.equiv文件配有某系统,任何用户都可以通过rlogin不需要口令以该用户的身份登录到系统。因此要为这些文件加锁,先创建它们,然后修改其属性为零即可。这样除了root用户就没有其它用户能创建或修改它们了。
/usr/bin/touch /.rhosts /etc/hosts.equiv
/usr/bin/chmod 0 /.rhosts /etc/hosts.equiv
.rhosts文件可以作为一个典型的后门文件使用,运行下面的命令全局查找.rhosts文件
#find -name“.rhosts”-print
6.5给系统打补丁
象其它的系统一样,Solaris系统也有它的漏洞,其中的一些从性质上来说是相当严重的。SUN公司长期向客户提供各种版本的最新补丁,放在http: //sunsolve.sun.com网站。可用#showrev –p命令检查系统已打的补丁或到/var/sadm/patch目录下查已打过的补丁号,用patchadd命令给系统打补丁。
七、Setuid设置和Solaris操作系统安全
http://bbs.chinaunix.net/forum/viewtopic.php?t=302945&highlight=Setuid
在Solaris中,文件除了读、写、执行权限外,还有一些特殊权限。 Setuid和setgid是其中的一类。它与Solaris系统的安全关系紧密。
Setuid是指设置程序的有效的执行用户身份(uid)为该文件的主人,而不是调用该程序的进程的uid。 Setgid与之类似。Setuid和setgid用ls –l显示出来为s权限,存在于主人和属组的执行权限的位置上。
这种权限的设置方法如下:
只设setuid: chmod 4xxx filename (xxx为一般读、写、执行权限)
只设setgid: chmod 2xxx filename
同时设setuid和setgid: chmod 6xxx filename
取消两种权限: chmod 0xxx filename
这种权限怎么用?
举个例子来说,假如某一命令(程序)的主人是root用户,并且该文件有setuid属性,但是该文件的读、写、执行权限的属性表明普通用户user1可以执行该命令,那么就表示:当该用户执行该命令时,他具有root的执行身份,并获得相应的权限。一旦该命令执行完成,该身份也随之消失。
为什么系统中需要有这样的权限呢?请执行以下操作:
7.1. $ ls –l /etc/shadow /bin/passwd
-r-sr-sr-x 3 root sys 99792 1999 2月 12 /bin/passwd
-r-------- 1 root sys 261 1月 3 13:12 /etc/shadow
/etc/shadow 文件由于存有用户的加密口令信息,对系统的安全至关重要,因此权限很严,只有root凭其对系统的至高无上的权限才得以对/etc/shadow可读可写。但是系统必须允许普通用户也能修改自己的口令。要让他们对/etc/shadow可写,又不能可读,而且可写又不能允许他们改别人的口令,怎么办?系统就采取这样一个办法:做一个程序, 也就是/bin/passwd,通过它可以在不显示文件内容的情况下直接修改/etc/shadow文件。可是这个程序怎么能有这样的权限?因为系统赋予它setuid权限,而且它属于root.这样,用户在使用/bin/passwd改口令时就有root权限.由于 /bin/passwd命令本身功能的局限性,用户并不能用它做更多的不利于系统安全的事。
7.2. 用普通用户身份修改口令
$ passwd
Enter login password: ****
New password:******
Re-enter new password:******
Passwd(SYSTEM): passwd successfully changed for xxx .
可以成功。
7.3. 用超级用户修改/bin/passwd的权限
# chmod 0555 /bin/passwd
7.4. 再重复2,是否还成功?当然不。
7.5.把/bin/passwd的权限恢复原状。
# chmod 6555 /bin/passwd
对此可以打一个生动的比喻:有一个绝密机关,不得已必须有一些不能见这些秘密的人进来做一些事情。于是授权一些特殊的“车辆”(没有窗户,门紧闭,所以看不到外面。只有一个小洞允许乘坐的人伸出一只手臂),带着所乘坐的人开到要去的地方,允许它办完事情马上带他出来。这样是不是很安全?不一定。如果“车辆”没有经过精挑细选是有很多“门窗”,那系统可就危险了。
这种安全威胁在Solaris中也有可能出现。比如做一下下面这个实验:
7.6. $ vi /etc/shadow
/etc/shadow: Permission denied.
7.7. 用超级用户身份
# chmod 6555 /bin/vi
# chown root /bin/vi
7.8. 这次再用普通用户身份试一试第6步,有什么结果?这次你能以普通用户身份修改 /etc/shadow了!!但是
$ more /etc/shadow仍然不成功,说明在执行/bin/passwd时有超级用户权限,平时仍是普通用户身份。
再来看一个令人不安的情况:
7.9.用超级用户身份
# chmod 6555 /bin/ksh
# chown root /bin/ksh
7.10. 用普通用户身份
$ ksh
#
发生了什么情况??普通用户不需要root口令就变成了root!!!
好可怕。如果有一个用户曾有一次获得超级用户权限,并通过类似的方式给自己设置了后门(也可能放了一个类似的文件在他自己的家目录中),以后他就可以随时变成超级用户了。
怎么能避免setuid的不安全影响,又利用其方便的地方?这里有几点建议:
关键目录应严格控制写权限。比如/,/usr等。
对不管是root帐号还是普通用户帐号的保密都有足够的重视。最好不要设置类似于guest、public、test之类公用的容易猜出口令的帐号。
对系统中应该具有setuid权限的文件作一列表,定时检查有没有这之外的文件被设置了setuid权限。
下面有一个自己编的小程序与大家分享。
程序功能描述:检查有没有/usr/secu/masterlist文件记录之外的其它文件被设置了setuid权限
事先要求:在系统调试完成,所有需要安装的软件安装好以后,执行下面命令生成检查对照文件
# mkdir –p /usr/secu
# find / -perm –4000 –print >; /usr/secu/masterlist
程序:
cd /tmp
[ -f secrcheck ] && rm secrcheck find / -perm -4000 -print >;secrcheck for f in `cat secrcheck` do grep -w $f /usr/secu/masterlist >;/dev/null if [ "$?" != "0" ]; then echo $f is not in list
fi done
rm secrcheck 在需要对系统做检查时,执行本shell程序。也可以放在定时进程中定时检查。程序由于需要在整个文件系统中做查找操作,需要比较长的时间。
请您作完本文中的实验后,别忘把文件的权限改回原状。
八、Solaris系统安全之审计
作为C2安全等级操作系统(公安部二级),Solaris最主要的安全功能之一就是审计功能,本文将简单介绍Solaris审计功能的使用和启动。
目的:纪录系统和用户事件,并对审计过程自身进行保护。这里值得注意的就是纪录事件的细度。Solaris提供了很强大的审计功能,甚至可以纪录每一条调试信息,但是这样做是不明智的,因为很多信息对用户没用,而且会使系统性能下降。审计细度需要管理员根据用途和需要自行订制。
实现:
8.1. 查看日志
1) history文件
通常在根目录下,隐藏文件,记录了root执行的命令
2) /var/adm
messages:记载来自系统核心的各种运行日志,可以记载的内容是由/etc/syslog.conf决定的
sulog:记载着普通用户尝试su成为其它用户的纪录。它的格式为: 发生时间 +/-(成功/失败) pts号
utmpx:这两个文件是不具可读性的,它们记录着当前登录在主机上的用户,管理员可以用w,who等命令来看
wtmpx:相当于历史纪录,记录着所有登录过主机的用户,时间,来源等内容,可用last命令来看
3) /var/log
syslog文件,这个文件的内容一般是纪录mail事件的
8.2. syslog
1) 实时错误检查:
tail –f /var/adm/messages
-f在监视器上允许看见每条记录 /var/adm/messages记录事件路径
2) /etc/syslog.conf语法:
*.err;kern.debug;deamon.notice;mail.crit /var/adm/messages
工具认可的值
值 描述
user 用户进程产生的消息。这是来自没有在文件列表中的设备的消息的默认优先级
kern 由内核产生的消息
mail 邮件系统
daemon 系统守护进程
auth 授权系统,如login、su
lpr 行式打印机假脱机系统
news 网络新闻系统USENET保留值
uucp 为UUCP系统保留值,目前UUCP不使用syslog机制
cron Cron/at工具;crontab、at、cron
local0-7 为本地使用保留
mark 内部用于由syslog产生的时间戳消息
* 除标记工具之外的所有工具
级别认可的值(按重要性降序排列)
emerg 用于通常必须广播给所有用户的恐慌情况
alert 必须立即被修正的情况,例如被损坏的系统数据库
crit 用户对关键情况的告警,例如设备错误
err 用于其他错误
warning 用于所有的警告信息
notice 用于没有错误但是可能需要特别处理的情况。
info 通知消息
debug 用于通常只在调试时才使用的消息
none 不发送从指出的设备发来的消息到选定文件中
3) 例如如果要纪录登录信息(telnet),可以这样做:
/etc/default/login中:SYSLOG=YES
/etc/syslog.conf中添加:auth.notice /export/home/wangyu/log
(把日志记录在/export/home/wangyu/log文件中,中间不是空格,是Tab)
重新启动syslog守护进程
当telnet上去的时候,我们看到/export/home/wangyu/log中有:
Sep 11 10:07:25 hlstar login: [ID 254462 auth.notice] ROOT LOGIN /dev/pts/1 FROM 192.168.0.9
8.3. Loghost
编辑/etc/syslog.conf,语法:
*.err;kern.debug;deamon.notice;mail.crit @loghost
(记录登录信息)
重新启动syslog守护进程
假设这次我们使用linux做日志主机:
[root@wangyu root]#/sbin/setup
打开配置界面-->;firewall configuration-->;custom-->;other ports:
写入 syslog:udp
重新启动防火墙
/etc/init.d/iptables restart或者/etc/init.d/ipchains restart
设置loghost接收网络日志数据,修改/etc/sysconfig/syslog配置文件:
修改 SYSLOGD_OPTIONS="-m 0" 为 SYSLOGD_OPTIONS="-r -m 0"
重新启动syslog守护进程
此时/var/log/messages最下端附近会看到类似下面的信息
Aug 11 21:20:30 logserver syslogd 1.3-3: restart. (remote reception)
当telnet上去的时候,我们看到/var/log/messages中有类似下面的信息:
Sep 5 11:08:31 mastadon login: [ID 507249 auth.notice] Login failure on /dev/pts/3 from 192.168.0.9, root
8.4. 记帐
Solaris操作系统可以通过设置日志文件可以对每个用户的每一条命令进行纪录,这一功能默认是不开放的
运行/usr/lib/acct/accton [路径][文件名]
(如/usr/lib/acct/accton /export/home/wangyu/test,将日志记录到test中)
查看的时候将文件移动到/var/adm目录下,改名为pacct
执行查看命令lastcomm(比如查看用户root,用命令lastcomm root)
8.5. BSM(以下部分节减自freedemon的“SecU Solaris p2.3 BSM审计系统”,详见 http: //bbs.nsfocus.net/index.php?act=ST&f=10&t=147174)
1) 开启BSM:
# init 1 (重新引导或改变运行级别到单用户状态)
#/etc/security/bsmconv (运行BSM初始化脚本,开启审计功能)
# reboot (重新启动系统,或者Ctrl+D改变到多用户状态)
2) 关闭BSM审计功能:
# init 1
# /etc/security/bsmunconv
# reboot
3) 配置文件的功能:
BSM所有的配置文件都存放在/etc/security目录下( (4)代表详细信息察看man (4) :
audit_class(4)
审计类别定义
audit_control(4)
审计进程控制信息
audit_data(4)
审计进程当前信息
audit.log(4)审计日志格式
audit_event(4)
时间定义到类别的映射文件
audit_user(4)
按用户审计时的用户定义文件
除了上面的配置文件之外,系统中还有一些用于BSM管理的脚本。
audit_startup(1M)
启动BSM进程运行。
auditconfig(1M)
读取配置文件,重新配置audit进程。
auditd(1M)
审计监控服务。
auditreduce(1M)
审计事件日志管理,可以调整日志格式,生成时间周期等信息。
auditstat(1M)
先是内核审计进程状态。
bsmconv(1M)
开启BSM功能。
bsmunconv(1M)
关闭BSM功能。
praudit(1M)
打印BSM审计日志内容。
4) BSM应用
在默认配置情况下,BSM每天(24小时)会生成一个以当天日期为名字的审计日志,存放在 /var/audit目录下,这个文件具有自己的数据结构,所以直接查看时是乱码,必须使用系统命令 praudit 来查看。
# praudit /var/audit/xxxxxx.xxxxxx.log
另一个可能用到的命令是auditreduce ,这个命令允许管理员对审计日志做一些设置,例如调整审计事件集或调整审计日志生成周期等等。auditreduce和praudit是系统中BSM管理最基本的两个命令,组合起来可以完成相当多的功能:
用管道联合两个命令,会显示系统中所有的历史审计事件。
# auditreduce | praudit
再加上lp,将把所有审计事件直接打印出来。
# auditreduce | praudit | lp
如果系统中有相当多的审计信息的话,查找将是非常困难的事情,这条命令可以按照yymmdd的时间格式显示目标时间段内的审计事件,范例为显示April 13, 1990, 用户fred的登录类别审计事件集。
# auditreduce -d 900413 -u fred -c lo | praudit
过滤目标时间所有的登录日志信息(Class:lo),并且输出到一个单独的日志文件中:
# auditreduce -c lo -d 870413 -O /usr/audit_summary/logins
auditreduce的 -b 和 -a 选项允许用户按照 yyyymmdd00:00:00 的时间格式制定一个时间段(Before & After)。
# auditreduce -a 91071500:00:00 | praudit
# auditreduce -b 91071500:00:00 | praudit
5) 管理工具:
eXpert-BSMTM
一个很强大的商业BSM分析工具,不过目前也可以免费使用,支持Solaris 7/8 (Sparc|Intel)平台,可以在下面地址下载。
http://www.sdl.sri.com/projects/emerald/releases/eXpert-BSM/download.html
Sun WBEM
Solaris内置的图形界面管理工具,也就是AdminConsole,在WBEM 2.3之后的版本支持对BSM信息的管理。可以用下面命令开启:
# /usr/sadm/bin/wbemadmin (第一次运行时会安装一系列的管理脚本)
# /usr/sadm/bin/smc (开启管理终端)
以上,对Solaris审计系统进行了配置,相信大部分用户行为和入侵行为都被记录下来了,并且对日志自身也进行了一定保护。如果管理员能及时分析日志,相信可以捕获大部分入侵企图和行为。