(不同的m签名时不同)。
签名:
r(签名)=(gkmodp)modq;s(签名)=(k-1(H(m)+xr))modq。
验证:
w=s-1modq、u1=(H(m).w)modq、u2=(r.w)modq;v=((gu1.yu2)modp)modq。
如果v=r,则验证成功。
2.安全SSH的工作原理
2.1.SSH的应用范围
2.1.1.特点及适用范围
SSH在端到端建立起一条安全会话的通道,包括使用公有密钥加密法进行用户和主机认证,和使用对称密钥进行数据加密。
适用范围:
防止包欺骗,IP/主机欺骗,密码截获,侦听,不适用的范围:
侦听对特定端口的攻击,Dos攻击等。
2.2.SSH的认证和加密方式:
2.2.1.SSH的体系结构:
连接层
用户认证层
传输层
传输层:
完成加密算法的协商,保证传输数据的致密性和完整性,在传送对称密钥的同时完成客户端对服务器端的认证。
用户认证层:
位于传输层之上,它在传输层保证数据致密性和完整性的情况下完成服务器方对用户方的认证。
连接层:
位于传输层和用户认证层之上,它负责连接通道的分配和管理。
如端口转发时虚通道的分配。
2.2.2.SSH的工作模型(Client/Server):
·建立连接
2.2.3.服务器端认证用户
认证的过程如上图所示:
客户端用自己的私钥将一段明文加密,并将自己的公钥附在密文后面传给服务器,服务器端用公钥解密,如果成功,再将公钥送往公钥数据库或认证中心进行身份认证。
·客户端对服务器端进行认证和对称密钥传送过程如下:
(1)客户端随机生成校验字节
(2)将校验字节发送给服务器(可加密)
(3)服务器依据一定算法从校验字节中抽取对称密钥
(4)服务器将校验字节用私钥加密附在公钥上传回客户端
(5)客户端解密后认证校验字是否为原始发送的校验字
·用对称密钥(会话密钥)加密传输数据
·断开连接
2.2.4.SSH的数据完整性
SSH包格式
验字节=摘要函数(数据,顺序号,会话密钥)
如果发送方和接收方校验字节相同,说明数据未被改动。
3.SSH的安装和使用
3.1.SSH的安装:
SSH1和SSH2基于不同的协议。
SSH1基于SSH.1.2.26协议;SSH2基于SSH2.0.0协议,因此二者并不兼容。
所以在选择版本时,要注意,你所连接或想要连接你的系统有什么版本你就应当选什么版本。
3.2.服务器端SSHD的使用和配置:
-bbits#可以指定服务器密钥的比特数。
隐含值为768bit,然而可以使它变得更大或更小,这取决于你是否从inetd启动守护或是否需要更强的安全性。
-d#调试模式。
这和sshd1一样。
安全shell守护被启动,但它并没有在后台运行也没有产生任何子进程。
调试级别越高,你接受到的信息也越多。
调试输出结果存放于系统的日志文件,而警报机制则将被关闭。
该模式仅能被用于服务器的调试,而不是为了增加日志文件的长度。
-fconfig-file#与sshd1一样,你可以指定一个特定的配置文件。
隐含值为/etc/ssh2/sshd-lonfig,但如果你不是以超级用户的权限来运行安全shell,你就需要在其他地方定义这个文件。
-glogin_grale_time#与sshd1一样,它设置安全shell守护中的“警报”机制。
它给客户程序一个确定的时间,每到相应的时间间隔,客户将和服务器确认一次。
隐含的时间为600秒(10分钟)。
如果客户程序不确认,服务器进程将断开socket连接。
你可以将它设置为0,这意味着对确认时间没有限制。
如果你将安全守护设为调试模式,该选项将自动地设为零。
-hhost_key_file#与sshd1一样,它指定用于私有主机密钥的文件。
如果你不是以超级用户的身份运行安全shell守护,你就必须使用该选项。
正常情况下,私有的主机密钥文件是不可读的(超级用户除外)。
但如果你以普通的用户身份运行安全shell守护,情况就不一样了。
同样,如果你使用了替换文件,确信其权限已被设为400。
-i#你可以指定是否从inetd运行安全shell。
与SSH1类似,你可以选择是否需要用TCP外包来运行安全shell守护程序或从inetd运行它。
从inetd运行安全shell会带来一些问题,因为安全shell守护需要产生服务器客户,然后响应客户,而这将会产生潜在的问题。
当服务器密钥重新产生时,客户程序为了得到一个正常长度或更为强壮的服务器密钥而不得不等待过长的时间。
然而,你也可以使用一个小一点的服务器密钥以提高性能,不过要记住:
密钥越小,系统越容易受到攻击。
-ooption#你可以指定用在配置文件中的选项,但命令行中的选项不能在这儿被指定。
-pport#与sshd1类似。
你可以指定服务器侦听socket的端口。
隐含值为端口22,它为安全shell所保留。
记住这也是在/etc/services中定义的端口号,除非你已经改变了它。
如果端口22已经被其他的应用程序使用或以非超级用户身份启动安全shell你可能希望定义一个替代的端口。
-q#指定哑模式,这意味着系统日志接受不到任何信息。
这同样与sshd1类似。
通常情况下被发送的内容为连接的起始,用户的认证及连接的终止。
除非你的系统日志总是很快就被填满,你最好不要打开这种模式。
因为这样你可以检查是否有人非法地进入系统。
-v#将安全shell守护置于详尽模式。
这和将选项-d2给sshd效果是一样的。
这同样意味着你不可能真正使sshd2的详尽模式运行,因为没有产生任何子进程。
注:
sshd2中没有-kkey_generation_time选项。
服务器密钥每小时重新产生一次
(1)在同一台主机上运行SSH1和SSH2守护程序
出于兼容性的考虑,你可能想让系统与SSH1兼容。
要做到这一点,你需要具备SSH1的最新版本(目前为1.2.27)以及SSH2的一份拷贝。
必须同时运行两种守护程序从而能接受和发送这两种版本的安全shell客户的连接请求。
如果没有这样做,你就不能发送或接受安全shell客户的连接请求。
至于真正的兼容性,SSH1与SSH2之间并不存在。
然而,你可以同时使用SSH1的最新版本与SSH2。
如果连接请求来自SSH1客户,SSH2守护将会把连接转寄到SSH1守护。
但你不能连接SSH1客户与SSH2服务器,反之亦然。
同样,如果你发现一个声称包长度有误的信息,检查一下,看看是否运行了一个SSH1的早期版本,要是这样,你就需要升级了。
(2)一些例子
这些选项并没有隐含地设置。
安全shell守护的隐含设置是使用768-bit的服务器密钥,它每小时重新产生一次,认证超时限度则为10分钟,在端口22上侦听连接,在/etc/ssh2目录下寻找配置文件等。
隐含情况下,安全shell守护以如下方式运行:
#sshd
下面的例子与第三章类似。
你可以发现,在使用方法上它们仅有很小的差别。
你也可以将这些选项赋上隐含值,这和隐含地执行命令有同样的效果。
#sshd–b768–f/etc/ssh2/sshd_config–g600–h/etc/ssh2/ssh_host_key–p22
你可以将安全shell的端口设置成高于1024:
#sshd–p2022为不同的端口建不同的配置文件?
没问题
#sshd–p2022–f/etc/sshd_config_weird_port
如果想通过inetd运行安全shell,你也可以做到这一点,不过别忘了将服务器密钥缩小一点。
记住,你并不希望自己的密钥非常脆弱。
同样,你也可能希望不是从命令行来完成该命令,而是在一个程序脚本上实现这一点:
#sshd–i–b512
注:
你应当编辑文件/etc/inetd.conf,然后从中运行sshd。
(3)从启动脚本中初始化安全shell
运行安全shell的大多数的系统管理员希望它总是处于运行状态,并且也不希望每次都要启动它,就能使其运行。
解决这个问题的一个简单的办法就是将其置于一个启动程序脚本中。
这和第三章“安全shell守护程序—sshd”中描述过的SSH1启动过程十分类似。
下图显示了不同的操作系统中启动安全shell守护的位置。
操作系统
启动程序脚本
SlackwareLinux
/etc/rc.d
RedHatLinux
/etc/rc*.d
Solaris
/sbin/rc*.d
HP-UX
/sbin/rc*.d
Irix
/etc/rc*.d
AIX
DECUNIX
(4)记录你的连接
安全shell守护程序在隐含的情况下,记录初始的连接请求,认证及连接终止。
既然代码是自由的,你会被欢迎来编辑并记录更多的信息。
这来自SlackwareLinux的日志文件/var/adm/message。
当连接被建立以后,你的日志文件看上去像下面的内容:
你也可以打开详尽日志或使用项关闭记录。
你同样可以用-DPARANOID选项使用TCP外包程序来记录每一个socket。
这有可能会复制安全shell守护程序的一些工作,也可以通过配置,使其能提供更为详尽的信息。
记住你的记录存放位置与操作系统有关。
Linux将信息存放于系统日志中,一般位于/var/adm/syslog,HP-UX或AIX则有可能将信息存放于完全不同的地方。
查阅你的操作系统使用手册以寻找记录文件的位置。
(5)配置安全Shell
安全shell有一个你可以定义选项的配置文件。
有一些选项是不能在命令行中被设置的,但可以在配置文件中设置它们以使其工作。
与大多数配置文件和shell程序脚本一样,空行和以“#”开头的行不会被系统读入。
安全shell的隐含配置文件是/etc/sshd2/sshd_config。
下面列出了你可以在sshd_config配置文件中为安全shell设置的选项。
在/etc/sshd2/sshd_config文件中,定义这些选项的格式如下:
OptionTypeArgument
如果你有多个参数,用空白行隔开它们。
这种格式对下面列出的选项都通用
1.允许的用户名与主机名
可以通过安全shell2过滤用户名与主机名。
这没有提供与SSH1一样多的过滤选项,但有一些还是很有用的,例如忽视rhosts文件和允许或禁止超级用户登录的权力。
IgnoreRhosts#这是一个与sshd1同样的配置选项。
它定义了.rhosts和.shosts是否被允许用来认证。
该选项对系统端的文件/etc/hosts.equiv和/etc/shosts.equiv没有影响。
选项的隐含值是“no”。
如果你想使用的话,用.shosts来代替.rhosts从而提高安全性能。
PermitRootLogin你可以定义超级用户是否可以通过ssh2登录进来。
隐含值是“yes”,但你可以将其关闭。
记住这对超级用户经过FTPtelnet或其他方式登录进来并没有影响。
2.认证选项
安全shell提供了不同的认证方法:
口令、.rhosts和公共密钥。
你既可以使用其中一种,也可以使用它们的组合以通过安全shell进入帐户。
记住,rhost认证是最脆弱的认证系统,而和公共密钥的组合则会成为最强有力的认证形式。
SSH2没有为TIS或dkerberos认证提供选项,至少在本书出版时尚未出现。
PasswordGuesses#该选项指定用户正确地键入口令前最多登录企图,以进行口令认证。
这个数字必须是一个整数,设置值越高,其他人窃取口令的可能性也就越大,如果你仅允许口令认证的话。
PasswordAuthentication#可以通过该选项决定是否利用口令以经过安全shell进入帐户。
它和sshd1配置选项一样。
隐含值为“yes”,口令被用来保护公共密钥而不是帐户自身。
你可能选择关闭口令认证,但是最好在使用PubKeyAuthentication时使用。
PermitEmptyPasswords#这个选项决定你是否想使用口令来帮助认证。
它和sshd1的配置选项一样。
可以允许空口令,然而,我们建议你最好不要这样做。
如果某人进入你的主机,最起码还需要提供口令以进入系统。
隐含值为“yes”。
通常情况下应将它们设为“no”。
RHostsAuthentication#该选项设置基于.rhosts或/etc/hosts.equiv的权限。
它与sshd1配置文件中的选项RhostsAuthentication选项一致。
这并不需要口令或公共密钥,但它使你的系统对伯克利服务攻击和其他迫使你必须使用安全shell的安全漏洞开放。
隐含值是“no”,最好就保留这个值。
如果你想使用Rhosts认证,就让它和RHostsPubKey-Authentication中的公共密钥认证结合起来使用。
RHostsPubKeyAuthentication#在安全shell2的最新版本中并没有安装这个选项。
它设置基于.rhosts或/etc/hosts.equiv的公共密钥认证,与sshd1的配置文件RhostsRSAAuthentication配置选项一致。
认证不需要口令,但要求在远程端有DSA或RSA密钥认证。
它同样使你的系统暴露于伯克利服务攻击,但公共密钥认证使危险性被最大限度地降低了。
如果你让该选项取值“yes”(这也是隐含值),你就有必要为主机设置更为严格的登录要求。
再说一句,如果你希望保持系统的安全,关闭任何类型的rhosts认证。
PubKeyAuthentication#可以使用任意多种类型的认证,或正如所见,也可以单独使用一种类型的认证。
比如说你就可以仅允许公共密钥认证工作。
这和sshd1的RSAAuthentication选项一致。
它并不需要rhosts或口令来协助认证。
隐含值为“yes”,你最好将选项保持在该状态。
3.服务器选项
这些选项用来定义安全shell守护的功能,包括TCP转寄,对特殊地址与端口的侦听,发送存活信息及服务器密钥的设置等。
Ciphers#可以指定准备用来加密的算法。
目前系统支持的算法有DES,3DES,Blowfish,Twofish,IDEA和Arcfour。
不可以为该选项指定其他的值:
any,anystd和anycipher,在你调试和测试时,将选项置为none。
Sshd1Path#如果你准备与SSH1兼容,就需要指定SSH1路径,尤其是当你将sshd1安装在一个非公共目录下时。
ForwardAgent#这个选项确定你是否能将安全shell认证代理(ssh-agent2)转寄到远程主机上。
你既可以打开又可以关闭这个选项。
KeepAlive#安全shell守护能通过设置来决定是否发生存活(Keepalive)信息。
存活信息能让远程的服务器知道连接是否已经中断,并在确定连接中断的情况下杀掉活动进程。
这和sshd1的配置文件中选项一致。
当然,如果程序只是暂时地挂起,它会发出如下的令人沮丧的信息:
Connectiondown:
disconnectin