OpenSSH 密码和公钥认证原理探究
配置和保护SSH
目标:使用 OpenSSH配置远程系统上的安全命令行服务
目标:
- 使用ssh登录远程系统并运行命令
- 为用户账户配置基于密钥的身份验证,以使其无需密码就能安全的登录远程系统
- 限制直接以root身份登录,并为OpenSSH 服务禁用基于密码的身份验证。
H3 - 使用SSH 访问远程命令行
H4 - 什么是OpenSSH ?
实际工作中,管理的都是远程服务器,例如,云主机。所以都是需要远程的登录到主机,管理服务器。而且也不可能直接操作物理控制台,因为云主机都是虚拟机。
通过web页面登录的实际上走的是vnc协议。
以前的时候,多使用telnet,但是现在淘汰了,用telnet一般也就是用来判断端口是不是侦听的。登录一般都是用SSH(OpenSSH,开源的)
引入:
以现有的实验环境举例:
workstation 和 servera,serverb 之间配置了OpenSSH,所以通过ssh协议登录的时候直接走密钥认证,根本不需要使用登录密码。 但是servera和serverb之间没有OpenSSH密钥认证,因此互相登录必须使用密码。
H4 - 登录方式:
以student账户登录到servera主机:
- 省略写法 :
ssh student@servera
# 这里没有指定端口号,是因为ssh协议默认端口就是22 - 选项写法:
ssh servera -l student -p 22
# -l 即 --login 登录名
H4 - 登录并执行临时命令:
H4 - 查看登录用户
当从workstation上通过ssh 连接到servera,在servera上可以通过w
命令查看:
该命令实际上是查看所有在线用户,无论是否远程登录,也包括了本地登录的用户。
还可以用过以下命令查看更加 详细的情况:
$ ss -tlna | grep :22
还可以通过rsyslog的安全日志查看登录记录
$ sudo grep sshd /var/log/secure
H4 - 登录原理
密码连接过程
在理解一次ssh连接的原理之间,需要先了解以下一些关键点:
公钥:加密
私钥:解密
默认SSH 的连接方式为密码认证:
过程:
- 客户端发动连接请求时,服务端将最新的公钥发送给客户端
- 客户端查看当前家目录下的文件 ~/.ssh/known_hosts 是否存在对方的公钥,如果存在,则第三步,如果不存在,则询问是否添加公钥。
- 询问客户端输入账户的密码,然后使用服务端的公钥进行加密,并发送给服务端
- 服务端使用对应的私钥解密,如果正确则允许登录。
总结@jayce:
总结一下,以上的ssh连接过程:
当从servera 尝试连接到serverb, serverb会将自己最新的公钥发送给 servera 。 servera 收到了发送过来的公钥, 首先在servera:~/.ssh/known_hosts 文件中去查找,是否存在该历史公钥,如果有直接下一步,如果没有,就将其内容写入到 servera:~/.ssh/known_hosts 文件(如果没有该文件,会自动创建,前提是存在sshd服务。)在确保servera的主机上(know_hosts)存在有serverb主机的公钥之后, 此时尝试登录的用户将会被询问远程登录账户的密码, 用户输入密码之后, 将使用 serverb 的公钥进行加密。 然后发送给serverb
serverb在接收到了加密过后的密码, 尝试使用私钥进行解密然后核对密码是否正确, 如果正确,才会准许servera 通过ssh 远程连接。
如果对连接过程还是不清楚,可以查看【附属】/第十章 SSH连接过程实验.md 中有详细的实验过程。
服务端更新密钥:
$ rm -f /etc/ssh ssh_host_* #删除公钥私钥
$ systemctl restart sshd #会重新生成
生成的密钥对存放在 /etc/ssh 目录下, 输入删除了密钥对,然后再尝试从servera 连接 serverb会发生什么 ?
提示:远程主机人正已经修改,有可能是中间人挟持攻击(略)所以一般在更新密钥的时候,远程连接的时候需要向管理员确认。
有三种不同的密钥对,区别在于使用了不同的算法
为什么会出现这个提示?
当servera 尝试 ssh 远程连接到serverb, serverb发送公钥给servera, 而servera之前是连接过serverb的,所有存在历史的公钥,但是现在,serverb的公钥修改了, 所以在 servera 上,比对历史公钥和最新的公钥的时候存在差异,所以就会报这个提示。
移除某主机的认证信息 : ssh-keygen -R hostname
ssh-keygen -R serverb
移除掉serverb的历史认证信息
移除掉之后,然后servera 重新连接serverb 就能够正常连接上了。
H 3- 密钥认证(公钥认证)
工作中,密钥人正更加安全,方便。
H4 - 引入:
以实验环境为例引入, 有虚拟机workstation 和 servera, serverb 。 workstation 和servera,serverb 之间就是走的公钥认证。 公钥认证使得ssh连接不需要输入密码。
示例:
$ ssh -i ./.ssh/lab_rsa student@servera
实际上,可以不用带 -i
选项, 因为当服务端开放了密钥(或者说公钥)认证(前提),那么在ssh 连接的时候,默认会走密钥认证, 如果认证失败,才会走密码认证。
所以实际上,一般是这样登录的:
$ssh student@servera
workstation:~/.ssh/lab_rsa 和 workstation:~/.ssh/lab_rsa.pub 是密钥对。
H4 - 密钥认证原理
在客户端和服务端是相互信任的情况下(绝对没有中间人)
客户端使用
ssh-keygen
命令生成密钥对 :ssh-keygen
$ ssh-keygen # 默认如果不加 -t 选项设定算法,默认的会以sha256 算法 # -t 选项选定特定的算法
$ ssh-keygen -t ecdsa
#ubuntu 示例
jayce@DESKTOP-JASQLDM:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jayce/.ssh/id_rsa):#密钥对存放的位置
Created directory '/home/jayce/.ssh'.
Enter passphrase (empty for no passphrase):#对私钥加密 ? 多了一把锁,泄露别人也用不了(如果是为了免密码认证,这里就不要加密了)
Enter same passphrase again:
Your identification has been saved in /home/jayce/.ssh/id_rsa
Your public key has been saved in /home/jayce/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:IyCSLQHKsHZykIFc7gaQfihunvz+dWOTs8dJxFB9UIQ jayce@DESKTOP-JASQLDM
The key's randomart image is: # 散列图
+---[RSA 3072]----+
|O++. ....=o |
|BBo . E . |
|B=++. o . |
|o=*o . o |
|o .o . S . |
| o. . ... |
|+ . . Bo . |
| + . o =+ |
| oo.. .. |
+----[SHA256]-----+
客户端将公钥发送服务端 user@host:~/.ssh/authorized_keys/
ssh-copy-id
$ ssh-copy-id -i 私钥 用户@主机
#eg: ssh-copy-id -i id_ecdsa.pub student@serverb
输入完命令之后,将会走密码完成复制。(拷贝到了 student@serverb:~/.ssh/authorized_keys/ )
连接时:
客户端发起连接
服务端收到信号后,随机生成字符串(每次连接都重新生成)并使用客户端提供的公钥进行加密,然后返回给客户端
客户端使用私钥进行解密。并将解密后的字符串再返回给服务端
客户端只知道公钥,私钥时正确的,服务端只知道字符串是否正确。两者都只知道自己的
服务端验证字符串是否是之前生成的,如果正确则允许连接。
H4 - **完整实验 - 密钥认证 - 从servera 连接至 serverb **
准备:初始状态:从servera 连接到serverb 需要密码认证:
servera 作为客户端,通过
ssh-keygen
生成 密钥对:通过
ssh-copy-id
命令,将 公钥 通过密码认证复制(发送)到预连接的 用户@主机可以验证一下:
尝试连接:
完整的连接应该是:ssh -i id_rsa
️ 普通密码认证,是server 发送 public key 到client, 而密钥认证是 client 生成密钥对,并发送 public key 到server
使得SSH 连接更加的安全:自定义 OPENSSH 服务配置
服务端: /etc/ssh/sshd_config
这里注意一下,补一个小概念:
SSH 作为多端程序,有客户端和服务端, 一般来讲,服务端应该是常驻进程,(也就是Linux 中的守护进程),这里的sshd就是守护进程。 为什么呢? 因为服务端应该时刻等待被连接,时刻都能都被连接上。 如果并不是单向连接,需要频繁的相互连接,那么各端都应该有守护进程。
#Port 22 //自定义端口,默认是22,修改设计Selinux 和防火墙#AddressFamily any //局域网中侦听的端口类型, inet(ipv4) 、inet (ipv6)、any(ipv4 & ipv6)#ListenAddress 0.0.0.0 //侦听端口,制定了端口就只能听到所侦听端口的登录申请。#ListenAddress ::PubkeyAuthentication yes //默认是否开启公钥认证,强烈建议开启PermitRootLogin no //强烈建议关闭(每时每刻都有在黑客在扫面是否有端口开放了root登录)AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 //密钥默认存放位置,如果公钥认证开了 这里一定要保证是开着的PasswordAuthenticatoin no //是否开启密码认证,如果同时开启了, 公钥认证和密码认证,那么将优先使用公钥认证。 如果公钥认证方式登录失败会使用密码认证, 而使用密码认证就有中间人挟持攻击的可能,所以一般正式生产环境,建议是关闭密码认证的。.......
自定义sshd的配置/etc/ssh/sshd_configPort 22 //端口号AddressFamily inet //IP协议类型 inet inet6 anyListenAddress 172.25.250.11 // 接口HostKey /etc/ssh/ssh_host_rsa_keyHostKey /etc/ssh/ssh_host_ecdsa_keyHostKey /etc/ssh/ssh_host_ed25519_keySyslogFacility AUTHPRIVPermitRootLogin no //关闭root远程登录PubkeyAuthentication yes //启用公钥认证AuthorizedKeysFile .ssh/authorized_keysPasswordAuthentication no //关闭密码认证ChallengeResponseAuthentication noGSSAPIAuthentication yesGSSAPICleanupCredentials noUsePAM yesX11Forwarding yesPrintMotd noClientAliveInterval 60AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGESAcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENTAcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGEAcceptEnv XMODIFIERSSubsystem sftp /usr/libexec/openssh/sftp-server
设定完成之后,重启 sshd 服务
$ systemctl restart sshd
OpenSSH 密码和公钥认证原理探究的更多相关文章
- ssh公钥认证原理及设置root外的其他用户登录ssh
1)创建其他用户 useradd [-d 登录目录] [-G ssh][用户名] 一定要将用户添加到ssh组不然无法没有权限登录ssh 2)设置ssh不允许root登录 vi /etc/ssh/ss ...
- 无线热点登陆认证原理探究---captive portal
什么是Captive Portal 大家肯定都连过公共场所的wifi热点,比如麦当劳等地方的.他们的wifi往往一连上去就会弹出一个要求登录或者微信关注之类的页面,只有在这个页面完成操作了才能正常访问 ...
- 无线热点登陆认证原理探究---captive portal 什么是Captive Portal
什么是Captive Portal 大家肯定都连过公共场所的wifi热点,比如麦当劳等地方的.他们的wifi往往一连上去就会弹出一个要求登录或者微信关注之类的页面,只有在这个页面完成操作了才能正常访问 ...
- 转: SSH 公钥认证
转: http://blog.knownsec.com/2012/05/ssh-%E5%85%AC%E9%92%A5%E8%AE%A4%E8%AF%81/ SSH 公钥认证 2012-05-15 简介 ...
- SSH认证原理和批量分发管理
SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...
- 使用SecureCRT设置linux系统登录的ssh公钥认证
1.修改ssh配置文件/etc/ssh/sshd_configRSAAuthentication yes //使用RSA加密算法PubkeyAu ...
- CA证书申请、认证原理
(一) 证书的申请 密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式,PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母,DER格式是二进制的密钥文件,直接打 ...
- 【爬坑系列】之解读kubernetes的认证原理&实践
对于访问kube-apiserver模块的请求来说,如果是使用http协议,则会顺利进入模块内部得到自己想要的:但是如果是用的是https,则能否进入模块内部获得想要的资源,他会首先要进行https自 ...
- Kerberos认证原理简介
1.1 What is Kerberos 1.1.1 简单介绍 Kerberos是一个用于鉴定身份(authentication)的协议, 它采取对称密钥加密(symmetric-key crypto ...
随机推荐
- BZOJ4919[Lydsy1706月赛]大根堆-------------线段树进阶
是不是每做道线段树进阶都要写个题解..根本不会写 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...
- Python | 标识符命名规范
简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量.函数.类.模块以及其他对象的名称. Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如 ...
- Python AttributeError: module 'sys' has no attribute 'setdefaultencoding'
Python 3 与 Python 2 有很大的区别,其中Python 3 系统默认使用的就是utf-8编码. 所以,对于使用的是Python 3 的情况,就不需要sys.setdefaultenco ...
- 『学了就忘』Linux基础命令 — 18、Linux命令的基本格式
目录 1.命令提示符说明 2.命令的基本格式 (1)举例ls命令 (2)说明ls -l命令的 输出内容 1.命令提示符说明 [root@localhost ~] # []:这是提示符的分隔符号,没有特 ...
- Linux的inode与block
1,inode包含文件的元信息,具体来说有以下内容: 文件的字节数 文件拥有者的User ID 文件的Group ID 文件的读.写.执行权限 文件的时间戳,共有三个:ctime指inode上次文件属 ...
- Linux 文本三剑客之 grep
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...
- 优客源创会 西安站 西邮Linux兴趣小组
2016年5月19日晚7:00,优客源创会西安站在西安邮电大学长安校区东区教学楼FF305如期举行,西安邮电大学计算机学院教授.西邮Linux兴趣小组指导老师陈莉君.王小银老师和来自开源中国的周凯先生 ...
- 攻防世界 WEB 高手进阶区 easytornado Writeup
攻防世界 WEB 高手进阶区 easytornado Writeup 题目介绍 题目考点 Python模板 tornado 模板注入 Writeup 进入题目, 目录遍历得到 /flag.txt /w ...
- Linux 下权限的管理
Linux 下权限的管理 我们都知道,Linux系统对于用户的权限管理是十分严格的. 那么,我们就来具体了解一下. 一. 用户 在Linux中按照类型用户分为两种:1.超级用户 2.普通用户 那么它们 ...
- dotnet templating 定制自己的项目模板
由于工作需要,研究了一下VS 项目模板生成的相关内容,本文做一下记录借助.NET Core Template Engine创建一个加单的项目模板. 创建项目代码和配置文件 首先创建一个Minimal ...