📄 00000018.htm
字号:
<BR> 原则上是不要使用system库例程,如果不得不使用,记得在所有调用命令的地方使用 <BR>绝对路径,一个相对路径的命令调用就是危险的定时炸弹。将所有setuid程序的属性置 <BR>为只执行,特别是不要允许用户能够读这个程序,即使是二进制代码,因为攻击者很容 <BR>易用文本工具搜索出程序里面使用的system调用。 <BR> <BR> 10.2.3 身份认证工具 <BR> <BR> 如同我们现在应该已经熟悉的那样,Linux缺省不允许root账号远程登录。这是由PAM <BR>系统设置的。这种设置某些用户在哪里使用计算机或者哪些客户机器可以使用本机的服 <BR>务的能力构成了安全性的第二道防线。 <BR> <BR> 首先可以通过PAM工具进行对系统的配置,通过在/etc/pam.d/login,/etc/pam.d/rl <BR>ogin等文件中加入pam的库的方法可以精确设置某个用户操作系统的能力,但是我们一般 <BR>不使用这种方式,而是利用TCP wrapper。 <BR> <BR> TCP wrapper是一个TCP连接的包装程序,例如在inetd.conf里面我们经常看到的tcpd <BR>程序,这个程序可以根据客户连接的发起地址判断是否允许连接。连接的控制方式我们 <BR>已经看到是在/etc/hosts.allow和/etc/hosts.deny。而且,tcpd程序还能够对连接的请 <BR>求通过syslog进行记录,你只要配置syslog.conf就可以控制记录。 <BR> <BR> 在第二章我们已经看到tcpd程序的用法。它用来保护在inetd.conf里面启动的程序, <BR>只要把tcpd加在对应服务进程的前面。例如我们想要把in.ftpd程序保护起来,就在ine <BR>td.conf中使用这样的一行: <BR> <BR> ftpstream tcp nowait root /usr/sbin/tcpd in.ftpd <BR> <BR> 这里没有使用in.ftpd的路径,因为这个程序是在/usr/sbin下面,如果你的服务程序 <BR>不在系统的缺省路径(/bin,/sbin,/usr/bin,/usr/sbin)下面,在文件名的地方使用 <BR>绝对路径名。 <BR> <BR> tcpd程序使用的身份控制文件是/etc/hosts.allow和/etc/hosts.deny,规则我们在第 <BR>二章已经介绍了。需要注意的是在这两个文件中使用的服务程序名既可以是inetd.conf <BR>里面的程序名字,也可以是services文件里面定义的服务名字。例如telnet服务的程序 <BR>文件是in.telnetd,因此在hosts.deny里面你应该使用telnet和in.telnetd各一行才能 <BR>真正禁止相应的服务。 <BR> <BR> TCP wrapper除了tcpd程序之外,还提供了一个用来检查/etc/hosts.deny和/etc/hos <BR>ts文件内容的工具,称为tcpdchk: <BR> <BR> # tcpdchk <BR> <BR> warning: /etc/hosts.allow, line 0: missing newline or line too long <BR> <BR> 除了标准的tcpd程序,还有许多类似的产品,如我们在qmail里面看到的tcpserver程 <BR>序。通过tcp包装程序,我们可以控制远程用户的访问。实际上,大部分tcp wrapper类 <BR>型的程序都可以提供类似的服务,我们可以选择自己喜欢的类型。 <BR> <BR> 10.3 加密和解密 <BR> <BR> UNIX中到处都是明文到密文的转换。一般来说,加密可以分为可逆和不可逆两种。不 <BR>可逆加密算法实际是生成一些校验码,利用算法的设计,使得两组不同数据实际不可能 <BR>生成同样的校验码。这样的技术一般用来作为文件传输的校验或者系统口令的验证。例 <BR>如目前版本的Linux就使用MD5算法来对用户的口令进行验证。 <BR> <BR> 可逆的加密算法是由明文产生出密文,并且还可以由密文转换回原始的明文。根据加 <BR>密/解密时使用的密钥,这种加密算法分成两类。第一类的加密和解密都是用同样的密钥 <BR>,这种加密算法一般用于对私人的文件和数据进行加密,例如常见的DES加密技术就是这 <BR>种类型。通常的密钥就是一个随机数字,依靠其随机性的特点获得安全。由于美国政策 <BR>的限制,一般的DES加密密玥被限制在56位。就目前的情况来看,56位的DES并不足以提 <BR>供足够的安全性。尽管如此,大部分UNIX的加密技术都是这一种。 <BR> <BR> 单密钥加密体系的主要问题是如果想让别人阅读你的加密文件,你必须告诉他你的密 <BR>钥。由于网络本身的特性,这种方式并不很安全。有另外的一种加密体系,称为双密钥 <BR>体系。在这种体系中,每个用户拥有两个密钥,分别称为私用密钥和公开密钥。用公开 <BR>密钥加密的数据只能用私用密钥进行解密,反之亦然。这样,如果有两个用户A、B想要 <BR>互通消息,那么A首先公开自己的公开密钥,B根据这个公开密钥对自己的某些信息进行 <BR>加密,然后传送给A,A得到这些信息之后,可以用自己的私用密钥将信息还原为明文。 <BR>即使B发送给A的信息被别的用户截获,由于没有私用密钥,他也无法知道信息的内容。 <BR>这种双密钥体系也很多,典型的如PGP算法。大部分网络数据传输用的加密算法都是这个 <BR>类型。 <BR> <BR> 目前大部分著名的加密和解密算法都是公开的。事实上,人们已经意识到,一个不公 <BR>开算法的加密系统,其可靠性是值得怀疑的,加密系统的可靠性应该主要地依靠算法本 <BR>身来保证。 <BR> <BR> 目前,PGP加密算法的源程序(以及使用PGP对文件进行加密的的程序)可以从网络上 <BR>自由下载,但是由于法律问题,在你准备对某个文件进行加密或者准备开发一个具有数 <BR>据加密功能的软件的时候,你应该先了解有关的法律。(在笔者写这本书的时候,美国 <BR>方面正式裁决PGP的发明者无罪,不过如果你在中国开发一个这种强度的加密程序,你首 <BR>先应该考虑有没有被起诉的危险) <BR> <BR> 假设你已经下载了PGP程序的源代码或者可执行程序,那么你就可以利用它对数据进行 <BR>加密了。 <BR> <BR> 工作的第一个任务是生成你的公用密钥和私用密钥,这可以用pgp –kg命令来生成, <BR>不过,我用的PGP-2.6.3i有一个问题,你必须首先在你的宿主目录下面建立一个.pgp目 <BR>录,否则生成过程会失败。 <BR> <BR> #mkdir .pgp <BR> <BR> #pgp -kg <BR> <BR> 在第一步过程中,要确定pgp密钥的长度,可以选择512,768或者1024位,我们一般都 <BR>选择1024位,因为pgp加密的速度相当快,所以选择1024位不会造成性能上的损失: <BR> <BR> Pick your RSA key size: <BR> <BR> 1) 512 bits- Low commercial grade, fast but less secure <BR> <BR> 2) 768 bits- High commercial grade, medium speed, good security <BR> <BR> 3) 1024 bits- "Military" grade, slow, highest security <BR> <BR> Choose 1, 2, or 3, or enter desired number of bits: 3 <BR> <BR> 下一步,需要设置你用户名和口令,用户名可以自己随便设置,口令是用来保护你的 <BR>私用密钥的,原则是尽量难猜一点,而且一定要记住自己的用户名和口令。 <BR> <BR> Enter pass phrase: <BR> <BR> Enter same pass phrase again: <BR> <BR> Note that key generation is a lengthy process. <BR> <BR> 然后pgp会要求你输入随机数字密钥,因为没有人喜欢输入这样长的数字,pgp的办法 <BR>是让你随机地敲打键盘产生出一个数字串,所以你可以任意敲键直到pgp的提示数字变成 <BR>0: <BR> <BR> We need to generate 1215 random bits. This is done by measuring the <BR> <BR> time intervals between your keystrokes. Please enter some random text <BR> <BR> on your keyboard until you hear the beep: <BR> <BR> 1215 <BR> <BR> 然后,就会在你的pgp目录下面产生出私用密钥的存储文件和公用密钥的存储文件,名 <BR>字分别是pubring.pgp和secring.pgp。 <BR> <BR> 那么,假如你要把某个文件加密传送给别人应该怎么办呢?办法是首先要生成你的公 <BR>用密钥输出文件: <BR> <BR> pgp –kx root public <BR> <BR> (root是我们设定的pgp用户名) <BR> <BR> 这样就生成了一个用来传送公用密钥的文件public.pgp。 <BR> <BR> 接下来,你就可以用pgp来加密你的数据了,例如,你要和user1通信,你首先把自己 <BR>的public.pgp交给user1,然后user1需要把这个公用密钥加入他自己的密钥环: <BR> <BR> pgp –ka public.pgp <BR> <BR> pgp会产生繁琐的询问,主要是问你是否愿意相信这个密钥,选择同意之后,这个密钥 <BR>就被加入到user1的密钥环中。 <BR> <BR> 然后,user1就可以用pgp加密一份文件了,比如,想把mychains文件加密后交给root <BR>,需要用root的公用密钥对mychains进行加密: <BR> <BR> pgp –e mychains root <BR> <BR> 这个过程会产生一个mychains.pgp文件,然后user1可以把这个文件发送给root,roo <BR>t接收到这个文件之后,可以对其进行解密: <BR> <BR> pgp mychains.pgp <BR> <BR> 这个动作将产生原来的mychains文件并且删除mychains.pgp文件。 <BR> <BR> 为了避免有人篡改pgp加密文件的情况出现,pgp使用了签名体系。所谓签名其实就是 <BR>信息的发送者通过某种算法为文件产生一个校验和(主要是利用md5单向加密算法),然 <BR>后用自己的私用密钥对这个校验和加密,并且把加密的结果放在文件中,最后用接收者 <BR>的公用密钥对整个文件(文件+校验和)加密,然后传递给对方。接收者首先用自己的私 <BR>用密钥解密整个文件,然后再用发送者的公开密钥解密校验和,最后自己计算校验和, <BR>如果这个文件在传输中被修改了,那么校验和就不会正确。 <BR> <BR> pgp还有很多参数,下面做一个简单的介绍: <BR> <BR> pgp -e[a] 源文件 收件人ID [其他收件人ID] <BR> <BR> 用收件人的公用密钥加密源文件,得到密文。当然条件是收件人的公用密钥已经按照 <BR>前面的办法加入到你的密钥环中。这个过程将会生成一个源文件名+.pgp后缀的二进制加 <BR>密文件。如果你想要把加密的结果通过电子邮件传送给别人,可以加上 a 参数: <BR> <BR> pgp –ea 文件名字 收件人ID <BR> <BR> 后将得到7bits编码的密文,后缀也变成了.asc。 <BR> <BR> pgp -s[a] 源文件 [-u 我的ID] <BR> <BR> 用我的私用密钥给源文件签名,如果不用缺省用户名就要用 -u 参数指定某个特定I <BR>D的私匙。同样,加上 a 参数可以得到7bits编码输出。 <BR> <BR> pgp -se[a] 源文件 收件人ID [其他收件人ID] [-u 我的ID] <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -