SSH是一种网络协议,用于计算机之间的加密登陆。javascript
$ ssh user@host (能够在config中配置,使用 ssh 别名,不须要用户名和主机ip. config配置见五) $ ssh host 若是本地用户名与远程用户名一致,登陆时能够省略用户名SSH的默认端口是22,登陆请求会送进远程主机的22端口,使用p参数,能够修改这个端口。html
$ ssh -p 2222 user@host
(1)远程主机收到用户的登陆请求,把本身的公钥发给用户。
(2)用户使用这个公钥,将登陆密码加密后,发送回来。
(3)远程主机用本身的私钥,解密登陆密码,若是密码正确,就赞成用户登陆。
首次登陆时,系统提示:没法确认主机真实性,只知道它的公钥指纹(公钥1024位,经过MD5计算,变成128位的指纹),是否链接?
当远程主机的公钥被接受之后,它就会和ip一块儿被保存在文件$HOME/.ssh/known_hosts之中。再次登陆时,主机发来的公钥直接与known_hosts文件中的对应iP的公钥做对比,从而跳过警告部分,直接提示输入密码。java
风险: 若是攻击者插在用户与远程主机之间(好比在公共的wifi区域),用伪造的公钥,获取用户的登陆密码。再用这个密码登陆远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。git
每一个SSH用户都有本身的独立的known_hosts文件,此外系统也有一个这样的文件,一般在/etc/ssh/ssh_known_hosts,保存一些对全部用户均可信赖的远程主机的公钥。github
SSH还提供了公钥登陆,能够省去输入密码的步骤。shell
(1)用户本地生成密钥对,一个私钥一个公钥。 (也能够远程生成一对,把私钥下载到本地)
(2)登陆前,上传本身的公钥到服务器 .ssh/authorized_keys中,注意文件夹和文件的权限。
(3)客户端向服务器发出请求,请求用你的密匙进行安全验证;
(4)服务器收到请求以后,先在该服务器上寻找你的公钥,而后把它和你发送过来的公用密匙进行比较。若是两个密匙一致,服务器就用这个公钥加密一个随机字符串并把它发送给客户端;
(5)本地收到后,使用私钥进行解密,若是生成密钥时,加了密码,此时须要密码,而后将解密后的字符串发送给服务端;
(6)远程主机获得的解密字符串与最初发送的一致,就证实用户是可信的,直接容许登陆shell,再也不要求密码。
这种方式的好处是其余机器没法仿冒真正的服务器,由于必须拿到客户端的公钥。这就要求用户必须提供本身的公钥。使用这种方法的步骤
:ubuntu
$ ssh-keygen $ ssh-keygen -b 1024 -t rsa -P '' -f ~/.ssh/id_rsa
参数说明:安全
-b:采用长度为1024字节的公钥/私钥对,最长4096字节,通常1024或2048,rsa方式最短不能小于768字节长度。 -t:指定生成密钥类型(rsa、dsa、ecdsa等),默认为SSH-2 的rsa类型; -P:指定passphrase,用于确保私钥的安全 -f:指定存放密钥的文件
运行上面的命令之后,系统会出现一系列提示,能够一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),若是担忧私钥的安全,这里能够设置一个。运行结束之后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。服务器
再一次强调用户本身的目录(~/.ssh)必须不能有其余人可写的权限,不然ssh服务器会拒绝登陆。网络
//~/.ssh 目录的必须是700权限 $ chmod 700 ~/.ssh
// ~/.ssh/authorized_keys 必须是600权限,, 不然ssh服务器会拒绝用户登录 $ chmod 600 ~/.ssh/authorized_keys
$ scp -P 22 ~/.ssh/id_rsa.pub user@host:~/authorized_keys #可选参数-P $ ssh-copy-id user@host #此种方式简单,不需追加改文件名,但不能指定端口号,默认以22端口 $ cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host 'cat >> ~/.ssh/authorized_keys'
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
另外,请留意 root 用户可否经过 SSH 登陆:
PermitRootLogin yes
当你完成所有设置,并以密钥方式登陆成功后,再禁用密码登陆:
PasswordAuthentication no
而后,重启远程主机的ssh服务。
// ubuntu系统 service ssh restart // debian系统 /etc/init.d/ssh restart
known_hosts, 首次登陆远程主机时,确认后,远程主机发来的公钥(是固定的,不是随机改变的,由于是公钥,可公开),以后登陆就再也不须要确认了。authorized_keys, 远程主机$HOME/.ssh/authorized_keys中,保存登陆用户的公钥。用于密钥登陆(免密码登陆)。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就好了。
这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
这条命令由多个语句组成,依次分解开来看:
写入authorized_keys文件后,公钥登陆的设置就完成了。
5、config文件
ssh client有两个配置文件,/etc/ssh/ssh_config和~/.ssh/config,前者是对全部用户,后者是针对某个用户,不存在能够建立一个,两个文件的格式是同样的。
ssh默认使用~/.ssh/id_rsa这个密钥,想使用指定密钥的两种方法:
Host server1 HostName server.com User username IdentifyFile path/to/id_rsa
使用 ssh server1。server1 就是个别名,能够任意取名,不取也能够
Host *github.com* User git IdentityFile ~/.ssh/id_rsa_github
示例: 有两个github帐号,一台电脑上都要访问这两个帐号,都使用ssh key认证方式
Host github-user1 HostName github.com User git IdentityFile ~/.ssh/id_rsa1 Host github-user2 HostName github.com User git IdentityFile ~/.ssh/id_rsa2
使用git clone时就用以下命令:
$ git clone github-user1:user1/repo.git $ git clone github-user2:user2/repo.git
指定哪一个用户登陆哪一个主机,使用哪一个私钥,权限 rw--r--r。 (ly:指定的是私钥,因此用于公钥/密钥/免密码登陆时。密码登陆不须要私钥。)
ssh_config和sshd_config都是ssh服务器的配置文件,两者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。两个配置文件都容许你经过设置不一样的选项来改变客户端程序的运行方式。