试验5
HTTP服务
估计时间: 1个小时
目标: 建立基本的拥有CGI的具有虚拟主机的Web服务器
试验的起点: 标准的Red Hat Linux安装
在整个试验中,主机和域名取决于您的机器的IP地址。如果下面的试验出现了X字样的名称,您应该把X字样的名称替换成您的工作站的号码(您的IP地址的最后一个部分)。例如,如果您的工作站的IP的地址是192.168.0.3,您应该将stationX.domainX.example.com转换成station3.domain3.example.com。
将数据包过滤设定为无效状态。在本次试验开始之前,请您确保您的主机上的所有包过滤已被关闭。缺省的安装将会有一个文件叫做“/etc/sysconfig/iptables”,该文件配置了iptable的功能。运行“chkconfig iptables off”。为了去除空间中所有的规则,运行“service iptables stop”
步骤1:服务的安装和基本的配置
场景/故事
您的组织需在一个小时内要一个Web服务器,拥有充足的CGI的能力比国内且具有为不同的虚拟主机提供不同的内容服务。
任务:
1. 需要如下的软件包:httpd和httpd-manual。如果需要的话,从CD或者ftp://server1/pub/RedHat/RPMS安装并...。使用chkconfig 来启动服务。
2. 启动httpd服务使用缺省的配置:service httpd restart
3. 检查在文件/etc/httpd/conf/httpd.conf中的DocumentRoot项目和下面的一样
DocumentRoot /var/www/html
4. 开启一个Web浏览器并且设定URL到:
http://stationX.example.com
如果您的浏览器在工作,您将看到缺省的服务器的索引页面。注意该文件并不是所存储的HTML文件,而是服务器在这些目录中没有缺省的index.html文件的时候自动生成的。
5.建立一个新的目录层次和一些新的内容
mkdir –p /var/www/virtual/wwwX.example.com/html
cd /var/www/virtual/wwwX.example.com/html
cat > index.html <
wwwX.example.com
EOF
(这建立一个只有一行的HTML文件)
6.在/etc/httpd/conf/httpd.conf尾部加入以下几行:
NameVirtualHost 192.168.0.X
7.确保您的DNS系统哦功能能够解析您的虚拟主机的名称。
dig wwwX.example.com
8. 重新启动httpd: service httpd reload
9.在您的Web浏览器并且设定URL到新的虚拟主机:
http://wwwX.example.com
您看到您自己定义的页面了么?
步骤2:使用CGI
任务
1. 在步骤1设定的 块中增加一行:
ScriptAlias /cgi-bin/
/var/www/virtual/wwwX.example.com/cgi-bin/
以上仅为一行并且在httpd.conf中不换行,注意给上面的两个元素之间留出空格。
2. 建立目录,然后在里面建立文件叫做test.sh 包含以下内容:
/var/www/virtual/wwwX.example.com/cgi-bin/test.sh
#!/bin/bashechoContent-Type: text/html;echo My username is:whoamiechoecho My idis:idechoecho My shell setting are:setechoecho My environment variableare:envechoecho Here is /etc/passwdcat /etc/passwdecho
3.通过把您的浏览器指向下面的地址尝试执行该CGI脚本
http://wwwX.example.com/cgi-bin/test.sh
为什么这个脚本不执行?检查日志文件/avr/log/httpd/获得信息来帮助你找到答案。(您是否计的重新启动或者重新载入服务器?)
4. 使得该脚本对于用户,组和其他可读并且可执行:
chmod 555 test.sh
现在脚本能够执行麽?
挑战1:为您的Web站点的文档提供安全访问
任务:
在wwwX.example.com的文档的根目录建立一个文件叫做.htaccess,并采用以下内容:
/var/www/virtual/wwwX.example.com/html/.htaccess
Authname “restricted stuff”AuthType BasicAuthUserFile /etc/httpd/conf/wwwXX.htpasswdrequire valid-user
2.建立您的域的密码文件。该文件必须被apache组可读。
htpasswd –mc /etc/httpd/conf/wwwX.htpasswd user_name
chgrp apache /etc/httpd/conf/wwwX.htpasswd
chmod g+r /etc/httpd/conf/wwwX.htpasswd
3.访问http://wwwX.example.com页面,您是否...httpd获得线索。
4.添加下列行到服务器的配置文件httpd.conf,在wwwX.example.com虚拟主机的 块中增加一行:
AllowOverride AuthConfig
5.再次尝试访问http://wwwX.example.com页面,您是否...室趁娴娜ㄏ廾矗?/a>
步骤3:Squid的基本配置
1. 在您的系统上安装squid
rpm –Uvh ftp://server1.example.com/pub/RedHat/RPMS/squid*
2.开始服务(service squid start),然后配置您的浏览器使用您的localhost作为您的Proxy并且把端口设定为3128。
3.尝试访问一些主页。如果教师里面没有Internet可以访问,那么试图访问http://server1.example.com,将会返回服务器的测试页面。
4. 现在使用您的邻居来吧您的主机当作Proxy。这样子应该不能工作。
squid返回的页面在/var/log/squid/access.log文件的底部有所解释。
5.使用您喜欢的文本编辑器打开/etc/squid/squid.conf文件。正如您所看到的,大部分是文档和注释。您也该注意到squid是非常易于调校的。对于本实验,我们仅作简单的配置,熟悉了以后您将会适应更加复杂的配置。
6.在文件中查找第二次出现Recommend minimum configuration的地方。您将会会看到缺省的存取控制列表(acl)。在CONNECT method CONNECT 行的下面添加一个对于本地网络的存取访问列表项目:
acl example src 192.168.0.0/24
对于这个配置您可以把它作为参考以应用到其他的任何地方。src是该acl的源IP地址。
7.在文件中查找INSERT YOUR RULE(S) HERE,在localhost acl的上面增加如下的内容:
http_access allow example
重新启动squid。 您的邻居将能够访问您的Web缓存了。
8.一些URL最好能够避免。返回到acl的部分,在您新添加行的下面(使用example.com如果您在教师里面没有Internet访问权限的话)
acl otherguys dstdomain .yahoo.com
acl otherguys dstdomain .hotmail.com
这里有一些要提及的东西。首先,注意到acl的附加属性。第二注意到dstdomain的acl类型,指明了关心的目的域。第三、注意到在域名前的点表示符号,确保加上点。
9.增加一条拒绝访问规则应用到这些存在问题的域。返回到您刚在添加allow的地方,在其下面增加如下行:
http_access deny otherguys
再次重新启动squid,再次检查这些相关的域,非常不幸,访问没有被拒绝。
10.再次打开配置文件,将您添加的拒绝规则放在example的允许规则之前。也就是说,在otherguys拒绝规则之前的example允许规则使得访问被允许,但是拒绝没有被生效。在移动规则以后,重新启动squid。这回它将禁止访问在任何上面禁止访问的域内的站点了。
复习的问题
1.根据/var/www/manual提及的服务器的手册。ServerAlias是起到什么作用?
2.根据/var/www/manual/suexec.html, suEXE对于CGI进程拥有什么特性?
3.下列命令起什么作用,何时使用它?
httpd –t
4. 您是否对您的用户能够通过CGI脚本看到您的/etc/passwd而感到不安?是否有方法阻止显示系统的密码文件?
试验6
NFS 和 FTP
估计时间: 1个小时
目标: 管理和配置vsftpd和NFS
试验的起点: 标准的Red Hat Linux安装
关掉包过滤:在着手试验之前需要确认包过滤没有被激活,默认情况下iptables会调用/etc/sysconfig/iptables这个配置文件,删除或重命名这个文件,iptables就会在下次启动时失效。或者使用命令chkconfig iptables off也行。如果想让iptables立刻失效可以用命令 service iptables stop.
步骤1:使用vsftpd允许匿名用户上传
1. 需要以下包:vsftpd 。如果没有安装,从CD或者ftp://server1/pub/RedHat/RPMS安装。激活vsftpd服务
2. Vsftpd包提供了/var/ftp作为匿名ftp用户的下载文件的目录。但是默认没有匿名上传的文件夹。要配置vsftpd来允许匿名上传,首先要准备一个上传目录:
cd /var/ftp
mkdir incoming
chown root.ftp incoming
chmod 730 incoming
现在检验一下新目录的权限:
ls –ld /var/ftp/incoming
3. 配置/etc/vsftpd/vsftpd.conf文件中如下各行:
anon_upload_enable = YES
chown_uploads = YES
chown_username = daemon
anon_umask = 077
另外, 默认情况下anonymous_enable = YES(允许匿名访问)已经被配置了
重启vsftpd服务
4.刚才配置的结果是使匿名用户可以上传文件到/var/ftp/incoming中,但是不能从这个文件夹中下载文件或者列出文件(使用ls命令),这样可以防止“warez”之类的组织用我们的上传目录作为“drop box”来放盗版软件或数据。如果希望匿名用户上传文件,应该让 /var/ftp/incoming 文件夹的所有者为daemon 所有组为 ftp,并且权限为600(只允许deamon用户读写)。
步骤2:NFS
任务:
5. 需要如下的软件包:nfs-utils。如果需要安装的话,请从CD或者ftp://server1/pub/RedHat/RPMS安装并...及nfslock服务。
6. 创建一个用户并且配置NFS共享他的主目录,共享给example.com读写权限。
a) 在配置NFS服务器之前,查看一下RPC服务是否在运行
rpcinfo –p
showmount –e localhost
b) 创建一个测试用户
useradd nfstest
c) 编辑 /etc/exports 来共享 /home/nfstest给example.com。如果你不知道这个文件的格式,请查看exports的man page。
d) 安装NFS的软件包,配置init运行级别3到5启用NFS服务,但是因为启动时如果/etc/exports 文件丢失或者它的大小为零, NFS服务不会启动。所以,你现在要来手动启动它,下一次启动时NFS就会自动启动了。
e) 观察RPC服务是否启动,看一看是否将/home/nfstest用nfs共享出来了:
rpcinfo –p
showmount –e localhost
f) 与一个或两个搭档相互mount对方的共享,然后再读取里面的内容,尝试用root和nfstest向其中写文件(如果你机器上的nfstest用户的UID和GID与搭档机器上该用户的不同,则把它们改成一样的)。看一下会怎样?为什么会这样?
试验8
身份验证服务
估计时间: 45分钟
目标: 培养有关身份验证的技巧
试验的起点: 标准的Red Hat Linux安装
关掉包过滤:在着手试验之前需要确认包过滤没有被激活,默认情况下iptables会调用/etc/sysconfig/iptables这个配置文件,删除或重命名这个文件,iptables就会在下次启动时失效。或者使用命令chkconfig iptables off也行。如果想让iptables立刻失效可以用命令 service iptables stop.
步骤1:使用PAM限制登陆的位置
场景/故事
您的系统中有高安全的内容。为了保证数据不被泄漏,你需要限制用户的访问,除了本地控制台,禁止任何其他方式访问系统。
任务:
1. 创建用户bill,他是user组的成员,再创建一个用户biff,他是finance组的成员
2. 编辑 /etc/security/access.conf 限定finance组的用户只能在第二个虚拟控制台登陆。为了达到这个目的,在这个文件的最后一行添加:
- : finance : ALL EXCEPT tty2
3. 通过编辑 /etc/pam.d/system-auth来限制所有服务,把以下这行添加到以auth开头的所有行后:
account required /lib/security/$ISA/pam_access.so
4. 如果你的限定起了作用,bill和root可以登陆到任何控制台,而biff只能在第二个虚拟控制台登陆
5. 清理:你如果运行authconfig工具,以上的操作将会被删除,你怎样确认你的设置有没有变化呢?
步骤2:使用NIS做身份验证
任务:
你应该与你旁边的人合作,然后决定谁做NIS的服务器端,谁做NIS的客户端,通过这个实验,你和你的同伴一起配置NIS的服务器端和客户端。你们要确定NIS的域名,还要注意每一个工作站的名字和IP地址,在开始以下的步骤之前,请确认以上内容。
1. 配置NIS服务器
a) 从ftp://server1/pub/RedHat/RPMS、光盘...抢锇沧耙部梢浴?/a>
b) 编辑 /etc/sysconfig/network ,添加这样一行:
NISDOMAIN = <你们的NIS域名>
下次启动时才会起作用,设置了NIS域名之后不要重新启动,运行命令:
domainname <你们的NIS域名>
c) 先将 /var/yp/Makefile 文件copy一份作为备份,编辑all部分只包含passwd和group:
all: passwd group
d) 打开portmap服务和ypserv服务
service portmap start
service ypserv start
e) 确保make包在你的系统中安装,(以下的命令是在 server1:/var/ftp/pub 已经被mount到/mnt/server1后才能使用)
rpm –Uvh /mnt/server1/RedHat/RPMS/make*
f) 使用ypinit产生NIS数据库(maps),注意可能出现的错误信息
/usr/lib/yp/ypinit -m
(注意:你不用在列表中添加任何主机,只要按 < CTRL - D > )
g) 启动NIS password升级进程
service yppasswdd start
h) 如果ypinit在第六步时没有错误,重新启动ypserv服务:
service ypserv restart
i) 使用ps auxf | grep yp确定ypserv服务运行,如果有错误的话查看日志 /var/log/messages
完成:正在正常工作的NIS服务器
2. 配置NIS客户端
到现在,任务只完成一半,你和你的同伴需要再配置这个NIS服务器的客户端。
a) 在客户端,确认已经安装以下几个包:portmap,ypbind,yp-tools和authconfig
b) 确认客户端可以看到服务器上的portmap服务
rpcinfo –p 你们的NIS服务器
c) 使用authconfig工具配置你的客户端使用NIS进行身份验证,选定“Use NIS”,在“Domain:”后指定你的NIS域,在“Server:”后指定你的NIS服务器。
d) 确认authconfig正确工作,当authconfig完成后,它会自动开启ypbind服务,是否有出错信息出现在控制台上或者 /var/log/messages中?
e) 测试你的NIS客户端,使用root用户登陆你的客户端,root用户是客户端上的root还是NIS服务器上的?测试 客户端----服务器的连接,使用:
ypcat passwd
这样会显示出NIS服务器上的password数据,(请记住,只有在服务器上/etc/passwd文件中UID大于等于500的用户才会被放进数据库中)
f) 使用useradd在客户端创建一个新的用户,然后在服务器端创建一个不同的用户,然后使用passwd设置他们的密码。
(在客户端): useradd -u 1024 localguy
passwd localguy
(在服务器): useradd -u 1025 nisuser
passwd nisuser
g) 确认使用localguy能在本地登陆,nisuser能在服务器上登陆。然后使用nisuser帐号在客户端上登陆,应该是不可以的。
h) 在服务器上的 /var/yp 目录,执行make命令,当命令完成,再使用nisuser从客户端上登陆,这回应该成功了,为什么?
i) 使用passwd改变nisuser的密码,是否改变了服务器上的 /etc/passwd 和 /etc/shadow 文件?NIS服务器中的文件是否改变了呢?你可以使用如下命令测试:
ypcat passwd | grep nisuser
j) 使用localguy登陆到客户端,是不是即时ypbind在运行仍然可以登陆?
k) 当你使用nisuser登陆到客户端时,你的主目录是什么?NIS仅仅提供验证信息,不提供客户端和服务器端的文件共享机制
完成:一个从NIS服务器上获得得验证信息的客户机
步骤3:限制NIS用户
任务:
我们的客户端现在是公司NIS体系的一部分,因为他储存了秘密数据,不是所有的用户都可以访问这台机器,只有特定的远程用户才能访问。
1. 这个测试需要添加一个NIS用户,使用useradd命令添加一个名叫baduser的用户。
useradd –u 1026 baduser
passwd baduser
2. 一个解决方案是使用pam_listfile,只允许nisuser访问我们的系统。打开 /etc/pam.d/system-auth ,紧接着auth开头的之后添加以下一行:
account required /lib/security/pam_listfile.so item=user sense=allow
file=/etc/nisusers onerr=fail
3. 假如测试目前的设置,你将会发现连root也不能登陆,所以千万不要关掉root的shell!你要创建 /etc/nisusers 然后把所有允许访问的用户添加到文件中,一行一个用户名,我们只想允许nisuser用户,所以我们的文件会非常短。
4. 现在绻?阆氲锹嫉轿谋究刂铺ǎ?挥衝isuser可以进入,因为其他人不在文件中,把root添加到 /etc/nisusers 中。
5. 我们的任务还是允许所有本地用户登陆的,我们可以把 passwd文件中的用户都添加到我们的列表中,但这不是最好的方法,我们可以使用PAM库中的pam_localuser来达到目的。添加以下这行到pam_localuser.so之后。
account required /lib/security/pam_localuser.so
6. 测试这样的配置,你会发现仍然只有root可以登陆,为什么呢?
7. 是因为required字段的关系,把上面添加的两行的required都改成sufficient,现在好了吧?如果改成requisite会怎么样?
8. 清理:再次运行authconfig工具,删除所有设置,并且禁用NIS。
试验9
系统监视
估计时间: 1小时15分钟
目标: 使用查找文件的方法来保护系统
试验的起点: 标准的Red Hat Linux安装
步骤1:定位易被攻击的文件或目录
场景/故事
查找文件系统中易被攻击的文件或目录
任务:
6. 查找有SUID和SGID的文件,并且把他们的名字存在 /root/stickyfiles中:
find / -type f -perm +6000 2> /dev/null > /root/stickyfiles
7. 查找任何人都可以写入的文件,把它们的名字储存在 /root/worls.writalbe.files:
find / -type f -perm -2 > /root/world.writalbe.files
8. 看一下 /root/stickyfiles 和 /root/world.writable.files 有哪些文件
步骤2:使用tripwire监视文件系统的完整性
场景/故事
你决定使用tripwire来确认数据的完整性
任务:
9. 使用root登陆并且安装tripwire 的RPM包(运行下面的这个命令之前需要把server1上的共享mount到 /mnt/server1目录上):
rpm –Uvh /mnt/server1/RedHat/RPMS/tripwire*
10. 看一下tripwire包中提供哪些文件和文档:
rpm –ql tripwire
11.编辑 /etc/tripwire/twpol.txt 来定义你的主机策略文件。默认的策略文件是基于Red Hatlinux的everything安装,这样它就会试图监视你没有安装的文件。结果是会产生一些出错消息,这些消息可以忽略。最好的方法是删除所有你没有安装的文件。
你应该定义自己的策略,仔细看一下策略文件,删除其中你机器上没有的文件。即使是只删除一两个你没有的文件就要花很长时间。现在来添加目前没有被监视的文件,添加 /etc/samba 目录到“Critical Configuration”部分。
12. 现在你定义完了你的策略,运行 /etc/tripwire/twinstall.sh ,这个脚本将建立加密的策略、配置和密钥文件。你需要输入一些密码,一旦这些步骤完成,在 /etc/tripwire中就会有一些新的文件产生。
13. 现在来用 tripwire –init 命令来初始化tripwire的数据库
tripwire会报告很多警告,这是因为它找不到在策略文件中包含的文件,你可以忽略它们。
14. 我们来测试tripwire,需要按照以下步骤完成
a) mv /sbin/ifconfig /sbin/ifconfig.bak
b) tripwire --check
15. 使用twprint生成一份报告,命令是这样的:
twprint -m r --twrfile \
/var/lib/tripwire/report/somehost.somedomain-200009-12134.twr
是否tripwire侦测到文件变化了?tripwire 会正确侦测到 /sbin/ifconfig丢失了。
把ifconfig还原回去,再次运行tripwire –check,这回还能侦测到改变吗?
mv /sbin/ifconfig.bak /sbin/ifconfig
tripwire –check
即使你把ifconfig还原了,但是修改的时间已经变化了,所以tripwire将会报告错误,升级tripwire的数据库
tripwire --update --twrfile \
/var/lib/tripwire/report/your_lastest_report_file
这将会启动默认的编辑器,这样你可以同意目前的变化。完成后退出编辑器,tripwire会升级你的数据库。
16.你可能会注意到top程序没有被监视,这个文件经常被“root kits”所替换调,所以它应该被tripwire监视,编辑/etc/tripwire/twpol.txt,在“System Administration Programs”项中添加/usr/bin/top 这项规则。
/user/bin/top -> $(SEC_CRIT);
升级你的策略:
Tripwire --update-policy /etc/tripwire/twpol.txt
完成:
数据完整性的工具应该每天根据数据库来运行。
步骤3:使用tmpwatch来清理临时文件目录
场景/故事
你需要确定或者确定并删除已经有一定时间没有人访问的文件。
任务:
1. 运行tmpwatch的test选项,这样可以看一下哪些文件7天没有人访问了:
tmpwatch –v –test 168 /tmp
步骤4:文件的访问控制
场景/故事
你想创建一些用户可以使用的文件,然而你想控制用户对这些文件的访问类型。
任务:
1. 创建一个名为supervisor的用户
2. 在supervisor的主目录下创建两个文件:
touch /home/supervisor/
3. 防止payroll文件被删除
chattr +i /home/supervisor/payroll
4. 只允许数据附加在old.employees文件上
chattr +a /home/supervisor/old.employees
5. 确认文件的属性被更改:
lsattr /home/supervisor/*
6. 试着删除payroll文件:
rm /home/supervisor/payroll
你收到什么错误的信息?
7. 试着编辑old.employees文件,在保存文件时有没有错误消息?为什么会/不会这样?出错的消息是什么意思?输入以下命令:
echo “foobar” >> /home/supervisor/old.employees
为什么这个命令可以工作?
完成:
1. 不能被删除的payroll文件
2. /home/supervisor/old.employee文件只能把数据添加到其中,不能删除任何文件中的内容。
步骤5:将日志集中写入一个专门的日志主机中
场景/故事
你的老板认为将所有日志写到一个专用的日志主机中是个非常好的主意
任务:
与你的旁边的人一起做实验
1. 首先配置syslogd可以接收远程的消息,编辑 /etc/sysconfig/syslog :
SYSLOGD_OPTIONS=”-r –m 0”
2. 重启syslogd:
service syslog restart
现在你的主机可以接收其他机器的消息了
3. 配置syslogd发消息给别的机器,在/etc/syslog.conf添加下面这行:
user.* @stationX
在这里stationX是旁边的机器
4. 重启syslogd:
service syslog restart
现在你的机器就会把用户运行的程序发给旁边的机器了
5. 使用logger创建一个syslog的消息
logger –i –t yourname ”this is a test”
这则消息是否显示在你旁边机器的 /var/log/messages中了呢?
问题:
为什么这个消息会显示在 /var/log/messages?
你怎么避免这种情况?
试验10
使网络安全
估计时间: 1小时
目标: 学习使用iptables构建一个防火墙
试验的起点: 标准的Red Hat Linux安装,kernel要支持防火墙,iptables
要安装
步骤1:创建一个简单的防火墙
场景/故事
你要建立一个防火墙保护你的主机不受可疑主机192.168.0.254的骚扰,可疑的主机不只这一个,你还要创建一个规则防止你的一个邻近的主机使用ping-flooding(洪水ping)攻击你的计算机。
任务:
9. 删除所有已经存在的用户定义的chains,重置所有chains上的默认规则,刷新所有规则:
iptables –F; iptables –X
for chain in INPUT FORWARD OUTPUT; do
iptables –p $chain ACCEPT
done
或者
service iptables stop
10. 阻止所有从邻近的主机(192.168.0.Y)的进来的连接:
iptables –A INPUT –s 192.168.0.Y –m state --state NEW –j DROP
这样还是允许你打开到他们系统的连接,但不是所有的
11. 限制从你的邻居(192.168.0.X)进来的ICMP echo request(回应请求)包
iptables -A INPUT -s 192.168.0.X -p icmp --icmp-type echo-request \
-m limit --limit 6/minute --limit-burst 2 -j ACCEPT
iptables -A INPUT -s 192.168.0.X -p icmp --icmp-type echo-request \
-j DROP
12. 显示你的防火墙策略
iptables -nl
13. 测试你的防火墙配置
a) 你的邻居(192.168.0.Y)能连接到你的系统吗?你能ping通他吗?
b) 确认你的邻居(192.168.0.X)使用的不是你在上面第2步时设置的地址。
c) 你的邻居(192.168.0.X)能ping通你的系统吗?你能ping通他吗?
14. 保存你的防火墙设置:
iptables-save > /etc/sysconfig/iptables
或者
service iptables save
15. 配置你的系统重启后仍保留新的防火墙规则:
chkconfig --level 2345 iptables on
现在确认一下
chkconfig --list iptables
16. 重新启动确认你的策略仍在。
完成:
1. 你可以主动连接你的邻居(192.168.0.Y)
2. 所有的主机都可以主动连接你,除了你的邻居(192.168.0.Y)
3. 你的另一个邻居(192.168.0.X)不能用ping-flood攻击你的系统。
清理:
当你确信成功完成了实验,让你刚才创建的策略实效:
service iptables stop
chkconfig iptables off
试验11
使服务安全
估计时间: 1小时
目标: 使用tcp_wrappers和xinetd限制用户对系统的访问
试验的起点: 标准的Red Hat Linux安装
步骤1:限制特定主机对服务的访问
场景/故事
某些特定主机和特定网段比较危险,为了保护你的主机,你决定阻止它们访问你的一些敏感的服务
任务:
把你的主机配置成以下的描述的样子(你需要跟其他两个人合作,让他们来测试),注意:如果没有安装telnet-server和openssh-server,要把它们的rpm包装上。
17. ssh可以被本地子网访问,但是不能让其他网段的用户访问。
18. telnet可以被你的三个邻居访问,但是不允许其他人来访问。
19. 任何服务都不接受从cracker.org来访问(你能找出特定的IP地址范围吗?)
你可以找出不同的解决方案,下一页是其中一种解决方法。
一种解决方法:
假定你使用旁边的三台计算机stationX.example.com、stationY.example.com、stationZ.example.com来测试你的配置。
1. 安装telnet-server:
rpm –Uvh /mnt/server1/RedHat/RPMS/telnet-server*
chkconfig telnet on
安装openssh-server:
rpm –Uvh /mnt/server1/RedHat/RPMS/openssh-server*
chkconfig sshd --add
2. /etc/hosts.deny
sshd :ALL EXCEPT 192.168.0.
3. /etc/xinetd.d/telnet:
only_from = 192.168.0.X 192.168.0.Y 192.168.0.Z
4. /etc/xinetd.conf
no_access = 192.168.1.0/24
如果想侦测出cracker.org的IP地址,你可以使用host命令:
host –l cracker.org server1.example.com
以上的命令查询名称服务器server1.example.com中的cracker.org区域信息,从返回的IP来看所有的记录都是192.168.1.0这个子网的。呵呵世界上的事情不可能如此简单,通常名称服务器(DNS服务器)只允许它的从服务器进行区域传递,而不会允许其他计算机这样的。所以为了保护你的安全,想知道整个区域的信息非常不容易实现。
步骤2
场景/故事
你已经通过配置/etc/hosts.deny限制FTP和telnet访问,现在要审核你正在运行的服务了,你需要一个搭档扫描你主机的端口。
如果你在一个可以连通到Internet的教室中,不要用nmap扫描外面的example.com域或192.168.0/24之外其他的网段,谢谢您的配合!
任务:
1. 找一台别人的主机用以下命令进行端口扫描:
nmap –sSUR –P0 –vO &> scan_of_stationX.txt
2. 在你的主机上使用root帐户登陆,运行以下命令查看你的哪些进程正在监听着哪些端口:
netstat –tulpe
主机上列出的端口与用nmap扫描的端口是否一致?如果你使用GNOME桌面环境,几个GNOME的连接端口可能会打开,退出X-window,进入运行级别3,netstat会报告相同的端口吗?
3. 现在使用chkconfig来验证你的系统,输入:
chkconfig --list |grep on
你的还配置了其他你不太了解的服务了吗,使用chkconfig和ntsysv命令来关闭你不用的服务,之后从新启动,重复第二步以上的步骤,netstat还会报告你关掉的服务的端口吗?
完成:系统审核显示只有需要的服务被运行。
试验12
数据安全
估计时间: 1个半小时
目标: 熟悉基于加密的工具
需要的RPM软件包: openssl,openssh,eopssh-clients,openssh-server
步骤1:使用gpg来交换加密的电子邮件
用户alice和bob希望能够安全的交换信息,使用GNU的Privacy Guard(gpg)来提供加密服务。您将建立两个用户,为他们的每个建立公钥和私钥。下一步,alice将获得bob的公钥,并且使用该公钥来加密给他的信息,bob将解密信息。
1. 建立用户
root@localhost# useradd alice; useradd bob
root@localhost# passwd alice
root@localhost# passwd bob
2.为每个用户建立公钥和密钥。注意到gpg第一次运行的时候,会建立缺省的初始化用户文件:当提示“…your message”,按下CTRL-C。
alice@localhost# gpg
alice@localhost# gpg –help
alice@localhost# gpg –gen-key
您将被提示多种的密钥参数。选择缺省的选项。当询问您的细节的时候,设定真实的名称为Alice。其他的信息您随便填写。您同时将被会问及您的密码。您可以使用任何密码(但是您必须自己记得住!);或者简单的敲两下<回车>不使用密码。
对于用户bob采用相同的步骤,设定其“真实的名称”为Bobby(gpg抱怨bob太短了)
3. 检查alice的公钥和密钥,该公钥和密钥存储在pubring.gpg和secring.gpg中。
alice@localhost$ ls ~/.gnupg
alice@localhost$ echo no-secmem-warning >> ~/.gnupg/gpg.conf
alice@localhost$ gpg --list-keys
/home/alice/.gnupg/pubring.gpg
------------------------------
pub 1024D/168F25D7 2003-09-18 Alice (demo key)
sub 1024g/CE26F831 2003-09-18
alice@localhost$ gpg --list-secret-keys
/home/alice/.gnupg/secring.gpg
------------------------------
sec 1024D/168F25D7 2003-09-18 Alice (demo key)
ssb 1024g/CE26F831 2003-09-18
4.让bob把他的公钥放在ASCII文件中以便方便的传递给alice。接下来,让alice导入bob的公钥到她的公钥环中去。
bob@localhost$ gpg --export --armor Bobby > /tmp/bob.key
bob@localhost$ cat /tmp/bob.key
alice@localhost$ gpg --import /tmp/bob.key
alice@localhost$ gpg --list-keys
/home/alice/.gnupg/pubring.gpg
------------------------------
pub 1024D/168F25D7 2003-09-18 Alice
sub 1024g/CE26F831 2003-09-18
pub 1024D/67C0F0AD 2003-09-18 Bobby
sub 1024g/FDD05A7A 2003-09-18
5.现在alice获得了bob公钥的副本,并且把它加入到她的公钥环中去。她可以给bob发送加密的消息。使用下面的命令步骤来使得alice发送给bob一个加密的/var/log/dmesg的副本。
alice@localhost$ cp /var/log/dmesg message.txt
alice@localhost$ gpg --encrypt --armor --recipient Bobby message.txt
alice@ station1$ head message.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
hQEOAzUJ6BL90Fp6EAP+J1gPH9RHQ1C+CaJGWSzUD2A603nspW2Ab+fQy7rmJbSA
5lwIPe5IzdmgSwMy80aefARQokI/cgdiWpb20Wzy2bltP413j/mrOiworKCOKguH
IJDQPqYxeticJSbwdZoTozsnLmWKp4uxappv3IaSI91w7REgN0KcwVetIn6UsYsE
AIKOqs1oXdYfU3Kzmt3DficQsZDgCuU1mVESCprb7Iyo/TvjjNuc9imqskrSveZZ
vFU8Loc7uI+gQ4HGUpFNryErMbaR2+KQnJCIz9GZJG/Lr7tFND4wCkFsu3jXvN6e
hUl5KRmRV3MWAkdOT4E3ZYF3dOhrdScxnpeIZdL5IDPo0usB9t2ZgIPHp9jKIIAc
alice@localhost$ mail -s "here it is" bob
6.现在让bob检查他的邮件,保存alice的邮件到文件。如果您不熟悉邮件客户端,您可以使用一个简单的基于命令行的mail工具
bob@localhost$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/bob": 1 message 1 new
>N 1 alice@stationa Thu Sep 18 22:02 84/4746 "here it is"
& w message_from_alice
"message_from_alice" New file
& q
bob@localhost$ less message_from_alice
bob@localhost$ gpg message_from_alice
您将被提示作为纯文本文件的文件名。使用缺省的message.txt。注意gpg自动的执行期望的动作,即,使用恰当的私钥进行解密。缺省的行为可以通过命令行的参数进行改变。
附加的步骤1的练习
1.使用gpg,使得alice能够向bob发送使用对成密钥加密的消息。
2.使得alice签署和加密消息给bob,bob需要什么其他的附加信息来验证签名
3.使得alice为她的消息建立一个拆离的签名,发送给bob消息和签名。让bob来验证拆离的签名
4.让bob签署alice的公钥,由此使得别人相信alice就是公钥的主人。
步骤2:使用ssh来进行加密的传输
场景A
alice和bob可能是不同工作站上的用户,他们希望建立等同的帐号。也就是说,alice希望访问bob的帐号而不需要输入密码,反之亦然。您将使用ssh提供如此的等同性。
在此步骤中提到的stationa指的是用户alice,然而stationb指的是用户bob。在执行此试验的时候您只需调正西医的步骤以适应您的主机名称。如果您的伙伴一起做这个试验,那么stationa和stationb指的就是您的机器的名称和他的机器的名称。如果您使用单一的机器,那么所有的机器名称将设定为localhost。
1. 确保适当的RPM软件包被安装
alice@stationa$ rpm -q openssh
alice@stationa$ rpm -q openssh-clients
alice@stationa$ rpm -q openssh-server
2.使得root帐户来确定bob机器上的sshd守护进程在运行
root@stationb# service sshd start
root@stationb# service sshd status
3.如果alice知道bob的密码,那么她可以通过ssh来访问其帐户。注意所有的和bob帐户的交互过程都是加密的,包括密码的传递。作为alice,运行如下的命令,在合适的时候提供bob的密码。
alice@stationa$ ssh bob@stationb ls /tmp
alice@stationa$ ssh bob@stationb
alice@stationa$ scp bob@stationb:/etc/services .
alice@stationa$ scp –r bob@stationb:/etc/xinetd.d .
4. 假设alice和bob希望采用更加安全的模式,让alice建立ssh的公钥和密钥对。注意到ssh-keygen应该被-t命令行开关启动,以至于密钥是通过DSA算法生成的。让alice检视其密钥(id_dsa)和公钥(id_dsa.pub)。
alice@stationa$ ssh-keygen –t dsa
alice@stationa$ ls ~/.ssh
alice@stationa$ less ~/.ssh/id_dsa
alice@stationa$ less ~/.ssh/id_dsa.pub
选择缺省的密钥位置的选项。同时,在提示的时候,通过按下选择一个空密码 。
5.让alice寄给bob她的公钥的副本。让bob把这个副本保存到文件~/.ssh/authorized_keys中去。
alice@stationa$ mail -s "my key" bob < ~/.ssh/id_dsa.pub
bob@stationb$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/bob": 1 message 1 new
>N 1 alice@stationa Fri Sep 19 15:56 13/982 "my key"
& w alice_key
"alice.key" New file
& q
bob@stationb$ mkdir ~/.ssh; chmod 700 ~/.ssh
bob@stationb$ cat alice_key >> ~/.ssh/autorized_keys
bob@stationb$ chmod 600 ~/.ssh/autorized_keys
6. 假设所有的东西都在其正确的地方(即,bob在他的授权的密钥中拥有alice的公钥的副本),alice现在可以访问bob的帐号,而不用提供密码。
alice@stationa ssh bob@stationb id
uid=508(bob) gid=508(bob) groups=508(bob)
alice@stationa ssh bob@stationb cvzf - /home/bob/ > \
> /tmp/bob.stationb.tgz
如果没有正确的配置的话,那么ssh仍然将会采用密码认证,并且提示alice输入密码。有几个步骤帮助您调试这种情况。首先,检查在服务器上的/var/log/messages和/var/log/secure文件以帮助您获得有用的信息。第二步,在ssh的客户端上采用-v命令行开关。这将会产生有用的调试信息。
7.对于bob也采用相同的配置,以至于其能够进入alice的帐户。
场景B
alice建立了公钥认证的Shell可以访问bob的帐户。她现在要求安全的访问(基于文本的)在bob机器上的Web服务。
1. 确保在bob机器上的Web服务运行正常。如果不是,那么通过root帐号登陆bob的机器,安装并且启动apache web服务。
alice@stationa$ lynx http://stationb/
2.使用ssh,使得alice连接到bob的帐户,为了达到另外一种效果,在alice的端口12345(或者其他未使用的端口)到bob的机器的Web服务器(端口80)建立一个加密的管道。
alice@stationa$ ssh bob@stationb –L 12345:stationb:80
(并且在另外一个终端)
alice@stationa$ lynx http://localhost:12345
alice将能够在步骤1和步骤2看到相同的Web页面。然而在第一步骤中,数据从Web服务器到alice的Lynx客户端是通过明文的方式发送的,这样很容易被嗅探到。在第二步中,数据包从Web服务器通过bob的ssh守护进程,通过密文的形式越过网络到达alice的ssh的客户端,并且解密和传送到alice的lynx客户端。