UNIX安全构架的九点经验
SSH的英文全称是Secure SHell。通过使用SSH,用户可以把所有传输的数据进行加密,这样即使网络中的黑客能够劫持用户所传输的数据,如果不能解密的话,也不能对数据传输构成真正的威胁。另外,传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP提供一个安全的“传输通道”。在不安全的网路通信环境中,它提供了很强的验证(authentication)机制与非常安全的通信环境。
SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是: 1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。
SSH提供两种级别的安全验证:
一是基于口令的安全验证。只要用户知道自己账号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证用户正在连接的服务器就是用户想连接的服务器。可能会有别的服务器在冒充真正的服务器,这存在着潜在的威胁。
二是基于密匙的安全验证。需要依靠密匙,也就是用户必须为自己创建一对公匙/密钥对,并把公用密匙放在需要访问的服务器上。如果需要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求使用用户的密匙进行安全验证。服务器收到请求之后,先在服务器上用户的主目录下找到该用户的公用密匙,然后把它和用户发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”并把它发送给客户端软件。客户端软件收到“质询”之后就可以用用户的私人密匙解密再把它发送给服务器。
安装与启动SSH
在Red Hat Linux 7以及其上的发行版本中已经包含了与OpenSSH相关的软件包,如果没有,则可以从OpenSSH的主页下载RPM包自行安装,OpenSSH的主页是地址是: www.openssh.com。主要安装如下几个包: openssh-3.5p1-6、openssh-server-3.5p1-6、openssh-askpass-gnome-3.5p1-6、openssh-clients-3.5p1-6、openssh-askpass-3.5p1-6。使用如下命令进行安装:
首先查询系统是否安装了上述软件包。
#rpm -qa |grep openssh
如果没有安装则执行如下命令。
#rpm -ivh openssh-3.5p1-6
#rpm -ivh openssh-server-3.5p1-6
#rpm -ivh openssh-askpass-gnome-3.5p1-6
#rpm -ivh openssh-clients-3.5p1-6
#rpm -ivh openssh-askpass-3.5p1-6
安装完成之后,可以使用下述两个命令中的任一个进行启动。
#service sshd start
#/etc/rc.d/initd/sshd start
另外,如果想在系统启动时就自动运行该服务,那么需要使用setup命令,在网络服务配置的选项中,选中sshd守护进程即可。
安装启动完OpenSSH之后,用下面命令测试一下。
ssh -l [username] [address of the remote host]
如果OpenSSH工作正常,将会看到下面的提示信息:
The authenticity of host [hostname] can''t be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
在第一次登录的时候,OpenSSH将会提示用户它不知道这台登录的主机,只要键入“yes”,就会把这台登录主机的“识别标记”加到“~/.ssh/know_hosts”文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。然后,SSH提示用户输入远程主机上用户账号的口令。这样,就建立了SSH连接,这之后就可以象使用telnet那样方便地使用SSH了。
SSH的密匙管理
1.生成用户自己的密匙对
用下面的命令可以生成公钥/私钥对: ssh-keygen t 类型。如果远程主机使用的是SSH 2.x就要用这个命令: ssh-keygen d。在同一台主机上同时有SSH1和SSH2的密匙是没有问题的,因为密匙是存在不同文件中的。ssh-keygen命令运行之后会显示下面的信息:
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.username/ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/.username /.ssh/id_rsa.
Your public key has been saved in /home/.username /.ssh/id_rsa.pub.
The key fingerprint is:
38:25:c1:4d:5d:d3:89:bb:46:67:bf:52:af:c3:17:0c username@localhost
Generating RSA keys:
Key generation complete.
“ssh-keygen -d”命令做的是同样的工作,但是它的一对密匙的保存路径默认情况下为: /home/[user]/.ssh/id_dsa(私人密匙)和/home/[user]/.ssh/id_dsa.pub(公用密匙)。现在用户有一对密匙了: 公用密匙要分发到所有用户想用SSH登录的远程主机上去; 私人密匙要好好地保管防止别人知道。用“ls -l ~/.ssh/identity”或“ls -l ~/.ssh/id_dsa”命令所显示的文件的访问权限必须是“-rw-------”。
如果用户怀疑自己的密匙已经被别人知道了,应当马上生成一对新的密匙。当然,这样做之后还需要重新分发一次公用密匙,才能正常使用。
2.分发公用密匙
在每一个用户需要用SSH连接的远程服务器上,都要在自己的主目录下创建一个“.ssh”的子目录,把用户的公用密匙“identity.pub”拷贝到这个目录下并把它重命名为“authorized_keys”。然后执行命令:
chmod 644 .ssh/authorized_keys
这一步是必不可少的。因为,如果除了用户之外别人对“authorized_keys”文件也有写的权限,那么如果遭到非法的破坏,SSH就不能正常工作。
如果用户想从不同的计算机登录到远程主机,“authorized_
keys”文件也可以有多个公用密匙。在这种情况下,必须在新的计算机上重新生成一对密匙,然后把生成的“identify.pub”文件拷贝并粘贴到远程主机的“authorized_keys”文件里。当然,在新的计算机上用户必须有一个账号,而且密匙是用口令保护的。有一点很重要,就是当用户取消了这个账号之后,必须记住把这一对密匙删掉。
下面是一些个人的经验的总结,相信对于是否受到入侵的UNIX或者UNIX-clonefreebsd,openbsd,netbsd,linux,etc)都是有用的:
首先大家可以通过下面的系统命令和配置文件来跟踪入侵者的来源路径:
1.who------(查看谁登陆到系统中)
2.w--------(查看谁登陆到系统中,且在做什么)
3.last-----(显示系统曾经被登陆的用户和TTYS)
4.lastcomm-(显示系统过去被运行的命令)
5.netstat--(可以查看现在的网络状态,如telnet到你机器上来的用户的IP地址,还有一些其它的网络状态。)
6.查看router的信息。
7./var/log/messages查看外部用户的登陆状况
8.用finger 查看所有的登陆用户。
9.查看用户目录下/home/username下的登陆历史文件(.history.rchist,etc).后注:''who'',''w'',''last'',和''lastcomm''这些命令依靠的是/var/log/pacct,/var/log/wtmp,/etc/utmp来报告信息给你。许多精明的系统管理员对于入侵者都会屏蔽这些日志信息(/var/log/*,/var/log/wtmp,etc)建议大家安装tcp_wrapper非法登陆到你机器的所有连接)
接下来系统管理员要关闭所有可能的后门,一定要防止入侵者从外部访问内部网络的可能。如果入侵者发现系统管理员发现他已经进入系统,他可能会通过rm -rf /*试着隐蔽自己的痕迹.
第三,我们要保护下面的系统命令和系统配置文件以防止入侵者替换获得修改系统的权利。
1. /bin/login
2. /usr/etc/in.*文件(例如:in.telnetd)
3.inetd超级守护进程(监听端口,等待请求,派生相应服务器进程)唤醒的服务.(下列的服务器进程通常由inetd启动:
fingerd(79),ftpd(21),
rlogind(klogin,eklogin,etc),rshd,talkd,telnetd(23),tftpd. inetd还可以启动其它内部服务,
/etc/ inetd.conf中定义的服务.
4.不允非常ROOT用户使用netstat,ps,ifconfig,su
第四,系统管理员要定期去观察系统的变化(如:文件,系统时间,等)
1. #ls -lac去查看文件真正的修改时间。
2. #cmp file1 file2来比较文件大小的变化。
第五,我们一定要防止非法用户使用suid(set-user-id)程序来得到ROOT 的权限。
1.首先我们要发现系统中所有的SUID程序。
#find / -type f -perm -4000 -ls
2.然后我们要分析整个系统,以保证系统没有后门。
第六,系统管理员要定时的检查用户的.rhosts,.forward文件
1.#find / -name .rhosts -ls -o -name .forward -ls
来检查.rhosts文件是否包含''++'',有则用户可以远程修改这个文件而不需要任何口令。
2.#find / -ctime -2 -ctime +1 -ls
来查看不到两天以内修改的一些文件,从而判断是否有非法用户闯入系统。
第七,要确认你的系统当中有最新的sendmail守护程序,因为老的sendmail守护程序允许其它UNIX机器远程运行一些非法的命令。
第八,系统管理员应当要从你机器,操作系统生产商那里获得安全补丁程序,如果是自由软件的话(如Linux平台,建议大家可以到linux.box.sk来获得最好的安全程序和安全资料。)
第九,下面有一些检查方法来监测机器是否容易受到攻击。
1.#rpcinfo -p来检查你的机器是否运行了一些不必要的进程。
2.#vi /etc/hosts.equiv文件来检查你不值得信任的主机,去掉。
3.如果没有屏蔽/etc/inetd.conf中的tftpd,请在你的/etc/inetd.conf加入tftp dgram udp wait nobody /usr/etc/in.tftpd
in.tftpd -s /tftpboot
4.建议你备份/etc/rc.conf文件,写一个shell script定期比较 cmp rc.conf backup.rc.conf
5.检查你的 inetd.conf和/etc/services文件,确保没有非法用户在里面添加一些服务。
6.把你的系统的/var/log/*下面的日志文件备份到一个安全的地方,以防止入侵者#rm /var/log/*
7.一定要确保匿名FTP服务器的配置正确,我的机器用的是proftpd,在proftpd.conf一定要配置正确。
8.备份好/etc/passwd,然后改变root口令。一定要确保此文件不能够入侵者访问,以防止它猜测。
9.如果你还不能够防止入侵者的非法闯入,你可以安装ident后台守护进程和TCPD后台守护进程来发现入侵者使用的帐号!
10.确保你的控制台终端是安全的,以防止非法用户能够远程登陆你的网络上来。
11.检查hosts.equiv,.rhosts,hosts,lpd都有注释标识#,如果一个入侵者用它的主机名代替了#,那么就意味着他不需要任何口令就能够访问你的机器。
http://www.hacker.cn/News/xtaq/2006-2/12/0621216085543057_2.shtml