分类: 网络与安全
2013-12-06 11:12:27
公司研发的软件产品、企业信息的核心数据,当然不希望员工随意散布,但如果太限制员工的网络自由会引起大家的反感。本文向大家介绍一种权宜的方法,允许员工网络自由的同时保护公司的代码和数据。
说明:以下步骤,非特殊说明所有操作都需root用户执行。
设置防火墙,只公开必须开启服务的端口,如果是开发机。只开启sshd(22)和ftp(20,21)端口。
iptabales配置示例如下:
[root@tp ~]# iptables -P INPUT DROP #默认禁止一切通信传入
[root@tp ~]# iptables -P OUTPUT DROP #默认禁止一切通信传出
允许sshd和ftp服务。
[root@vmleman ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
[root@vmleman ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@vmleman ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@vmleman ~]# iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
[root@vmleman ~]# iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
[root@vmleman ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
允许loopback(可用于本地访问来做软件测试)
[root@vmleman ~]# iptables -A INPUT -i lo -p all -j ACCEPT
[root@vmleman ~]# iptables -A OUTPUT -o lo -p all -j ACCEPT
在/etc/ssh/sshd_config里面找到下面一行并将其注释。
#Subsystem sftp /usr/libexec/openssh/sftp-server
至此,用户无法通过sftp传输文件。此配置重启后才生效。
任何系统都需要和外界沟通,完全独立的系统没有意义,这一步将实现这个特殊通道,允许特殊文件(如编译后的可执行文件)传出。 以vsftpd(配置文件为:/etc/vsftp/vsftpd.conf)为例,说明ftp服务器访问策略配置。
1)修改vsftpd配置文件如下:
# local_enable=YES (禁止本地用户用户登入ftp服务器) anonymous_enable=YES (允许匿名用户访问,vsftpd默认为允许)
2)确保匿名用户主目录及其子目录对普通用户没有写权限。
现在匿名用户所在目录(/var/ftp/)任何人都可访问,相当于外部环境,因此不允许一般用户写入,否则数据将会传出。
[rhel5@vmleman ftp]$ ls -ld `find /var/ftp/`
drwxr-xr-x 3 root root 4096 2011-09-08 /var/ftp/
drwxr-xr-x 2 root root 4096 2007-12-13 /var/ftp/pub
CentOS系列默认就是没有写权限的,基本不需要修改。
这个脚本主要用来检查传输的文件进行检查。这个脚本设置为只有root有权限执行,其他用户没有任何权限。
[root@vmleman ~]# ls -l /root/bin
总计 8
-rwx------ 1 root root 575 09-04 15:04 chkcp.sh
这里的chkcp.sh是一个示例的shell脚本(你可以使用任何语言,或者是C),检查只允许可执行文件才可以传出来:
#/bin/bash export LANG=en_US if [ $# != 2 ]; then echo "usage: chkcp.sh"; exit fi filetype=`file ${1} ` #得到文件类型 allow=`echo ${filetype%:.*} |grep "executable.*object module"` #检查是否为AIX的XCOFF可执行文件 if [ -z "$allow" ]; then allow=`echo ${filetype%:.*} |grep ELF` #检查是否为Linux的ELF可执行文件 if [ -z "$allow" ]; then echo deny ${1} #检查失败直接退出 exit; fi fi cp -f ${1} ${2} #检查通过后实现拷贝传出 if [ "$?" == "0" ]; then echo "${1} copyed." fi
由于之前匿名用户主目录(/var/ftp/)对普通用户不可写,所以普通用户不能直接将文件传输。
然而可以利用sudo命令调用第三步的root用户的传出脚本(chkcp.sh),这样就可以将文件拷贝出来,但文件被拷贝出来之前必须经过我们预设脚本的检查,不符合要求的文件不允许传出来。在一定程度上实现了对敏感数据的外泄的防护。规则配置如下:
1)添加sudoers文件的写权限:
[root@vmleman bin]# chmod u+w /etc/sudoers
2)在文件末尾添加如下内容:
User_Alias CHKCPOUT = rhel5, sips CHKCPOUT ALL=NOPASSWD: /root/bin/chkcp.sh
其中rhel5和sips是允许调用chkcp.sh传出文件的用户名列表,你可以自己修改。没有添加的用户不能调用chkcp.sh,所以无法传出任何文件。
3)恢复权限:
[root@vmleman ~]# chmod u-w /etc/sudoers
4)验证结果: 切换到刚刚sudo配置的普通用户(如rhel5)下,运行sudo -l查看权限:
[rhel5@vmleman ~]$ sudo -l
User rhel5 may run the following commands on this host:
(root) NOPASSWD: /root/bin/chkcp.sh
此时我们可以用chkcp.sh来拷贝文件了。
[rhel5@vmleman ~]$ /root/bin/chkcp.sh a.out rhel5.a.out
-bash: /root/bin/chkcp.sh: 权限不够
[rhel5@vmleman ~]$ sudo /root/bin/chkcp.sh a.out rhel5.a.out
a.out copyed.
[rhel5@vmleman ~]$ sudo /root/bin/chkcp.sh a.c rhel5.a.c
deny a.c
[rhel5@vmleman ~]$ ls -l /var/ftp/pub/
总计 24
-rwxr-xr-x 1 root root 9860 09-04 15:30 rhel5.a.out
drwxr-xr-x 2 root root 4096 09-04 14:15 ss
检查发现只有可执行的a.out文件被拷贝出,源代码文件被拒绝。
有时候,我们也需要将外部文件传入到服务器上。 这时可以不用做文件类型检查,不过也需要配置一个严密的安全通道。
1)在匿名用户主目录下创建upload目录,属主改为ftp
[root@vmleman ~]# mkdir /var/ftp/upload
[root@vmleman ~]# chown ftp /var/ftp/upload/
2)配置vsftpd.conf,添加匿名用户权限
anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=022
设置umask是为了防止创建其他用户可写的目录,产生安全漏洞。
这样,任何人都可以用ftp将文件放到upload目录下,登入到系统后,再从这个目录下拷贝内容即可。
到目前为止,基本上可以防止敏感文件的外泄。但是还有一个问题,一般情况下,用户使用SecureCRT或者Putty等其他软件登入服务器,用户可以通过cat命令把文件打印到屏幕,然后复制其中的内容。如果用户将SecureCRT的屏幕缓存设置足够大的话,就可以一次复制很多文件内容。要想解决这个问题,需要用到一个私有的SSH客户端41putty,它可以防止用户大量复制屏幕内容。
关于41putty的使用方法,请参考。
原文出自: