SSH 连接建立过程
- 服务器建立公钥文件
- 客户端主动连接请求
- 服务器传送公钥文件给客户端
- 客户端记录/比对服务器的公钥数据及随机计算自己的公私钥
- 返回客户端的公钥数据到服务器端
- 服务器接收私钥开始双向加解密
客户端的用户主目录下的~/.ssh/known_hosts中会记录曾经连接过的主机的公钥,用于确认我们已连接上正确的服务器。
客户端配置文件:/etc/ssh/ssh_config
[root@CentOS ~]# man sshd_config
服务器端配置文件:/etc/ssh/sshd_config
[root@CentOS ~]# man ssh_config# 如何产生新的服务器的SSH公钥与服务器自己使用的成对私钥 # 服务器提懂得公钥与自己的私钥都放在/etc/ssh/ssh_host*, [root@CentOS ~]# rm /etc/ssh/ssh_host* [root@CentOS ~]# /etc/init.d/sshd restart [root@CentOS ~]# date; ll /etc/ssh/ssh_host* Sat Apr 8 21:14:10 CST 2017 -rw-------. 1 root root 668 Apr 8 21:09 /etc/ssh/ssh_host_dsa_key -rw-r--r--. 1 root root 590 Apr 8 21:09 /etc/ssh/ssh_host_dsa_key.pub -rw-------. 1 root root 963 Apr 8 21:09 /etc/ssh/ssh_host_key -rw-r--r--. 1 root root 627 Apr 8 21:09 /etc/ssh/ssh_host_key.pub -rw-------. 1 root root 1675 Apr 8 21:09 /etc/ssh/ssh_host_rsa_key -rw-r--r--. 1 root root 382 Apr 8 21:09 /etc/ssh/ssh_host_rsa_key.pub # 启动 SSH 服务 [root@CentOS ~]# /etc/init.d/sshd restart [root@CentOS ~]# netstat -tlnp | grep ssh # SSHD 可以同时提供 shell 与 ftp ,而且都是架构在 port 22 上面的
SSH 客户端连接程序
1 . SSH:直接登录远程主机的指令参数:
-f:需要配合后面的命令。不登录远程主机直接发送一个命令过去而已-o:ConnetcTimeout=秒数:连接等待的秒数,减少等待的时间,
StrictHostKeyCheckking=[yes|no|ask]:默认是ask,若要让 public key 主动加人 known_hosts,则可以设置为 no 即可。
-p:如果 sshd 服务启动咋非标准的端口,需使用此项目。
[root@CentOS ~]# ssh [-f] [-o 参数项目] [-p 非标准端口] [账号@]IP [命令] # 直接连接登录到对方主机的方法 ssh: connect to host 127 port 22: Invalid argument [root@CentOS ~]# ssh 127.0.0.1 The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. RSA key fingerprint is 80:01:22:22:11:24:71:69:75:47:b2:56:bf:54:b6:70. Please type 'yes' or 'no': yes Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts. root@127.0.0.1's password: #输入root的密码 Last login: Sat Apr 8 19:49:27 2017 from 192.168.1.109 [root@CentOS ~]# exit logout Connection to 127.0.0.1 closed. # 使用 student 账号登录本机 [root@CentOS ~]# ssh student@127.0.0.1 # 登录对方主机,执行过命令后立刻离开的方式 [root@CentOS ~]# ssh student@127.0.0.1 find / &> ~/find1.log # 与上题相同,让对方主机自己运行该命令,你立刻回到本地端主机继续工作。 [root@CentOS ~]# ssh -f studnet@127.0.0.1 find / &> ~/find1.log # 此时你会立刻注销 127.0.0.1,但 find 命令会自己在远程服务器运行 # 不加-f 参数,那就会等待对方主机关机完毕再将本地端主机断开连接 # 加上-f 参数,会指定指定远程主机自己运行关机,而不需要再等待。 # 删除 known_hosts 后,重新使用 root 连接到主机,且自动加上公钥记录。 [root@CentOS ~]# rm ~/.ssh/known_hosts [root@CentOS ~]# ssh -o StrictHostKeyChecking=no root@localhost
2 . 服务器公钥记录文件:~/.ssh/hknown_hosts
# 测试服务器重新安装后,假设服务器使用相同的IP,造成相同IP的服务器公钥不同 # 删除原有的系统公钥,重新启动 SSH 让你的公钥更新 [root@CentOS ~]# rm /etc/ssh/ssh_host* [root@CentOS ~]# /etc/init.d/sshd restart Stopping sshd: [ OK ] Generating SSH1 RSA host key: [ OK ] Generating SSH2 RSA host key: [ OK ] Generating SSH2 DSA host key: [ OK ] Starting sshd: [ OK ] # 然后重新使用下面的方式进行连接操作 [root@CentOS ~]# ssh root@localhost @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is cc:73:b6:f1:0b:15:77:aa:f2:08:18:22:c8:7f:de:cb. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending key in /root/.ssh/known_hosts:1 #冒号后面接的数字就是有问题的数据行号 RSA host key for localhost has changed and you have requested strict checking. Host key verification failed. # 解决方法:用 vim 删除提示错误信息的第一行(~/.ssh/known_hosts),重新登录ssh ,系统会重新询问要不要加上公钥
SFTP:模拟 FTP 的文件传输方式
SSH 是登录远程服务器进行工作,如果想要从远程服务器下载或上传文件,那就必须使用SFTP或SCP。[root@CentOS ~]# sftp root@localhost Connecting to localhost... The authenticity of host 'localhost (127.0.0.1)' can't be established. RSA key fingerprint is cc:73:b6:f1:0b:15:77:aa:f2:08:18:22:c8:7f:de:cb. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (RSA) to the list of known hosts. root@localhost's password: #root的密码 sftp>
针对远程服务器主机的行为 切换目录到 /etc/test 或其他目录 cd /etc/test、cd PATH 列出当前所在目录下的文件名 ls dir 建立目录 mkdir directory 删除目录 rmdir directory 显示当前所在的目录 pwd 更改文件或目录的属组 chgrp groupname PATH 更改文件或目录的属主 chown username PATH 更改文件或目录的权限 chmod 644 PATH 建立链接文件 ln oldname newname 删除文件或目录 rm PATH 更改文件或目录名称 rename oldname newname 离开远程主机 exit或者bye或者quit 切换目录到本机的PATH的当中 lcd PATH 列出当前本机所在目录下的文件名 lls 在本机建立目录 lmkdir 显示当前所在的本机目录 lpwd 将文件由本机上传到远程主机 put [本机目录或文件] [远程] 将文件由远程主机下载回来 get [远程目录或文件] [本机] # 假设localhost 为远程主机,且服务器上有 student 这个用户。想要将本机的 /etc/hosts 上传到 student 用户主目录,并将 student 的.bashrc 复制到本机的 /tmp 底下 [root@CentOS ~]# sftp student@localhost Connecting to localhost... student@localhost's password: sftp> lls /etc/hosts /etc/hosts sftp> put /etc/hosts Uploading /etc/hosts to /home/student/hosts /etc/hosts 100% 165 0.2KB/s 00:00 sftp> ls hosts sftp> ls -a . .. .bash_logout .bash_profile .bashrc .emacs .gnome2 .mozilla hosts sftp> lcd /tmp sftp> lpwd Local working directory: /tmp sftp> get /bashrc Couldn't stat remote file: No such file or directory File "/bashrc" not found. sftp> lls -a . keyring-lZcUuf virtual-root.Bl7Y3G vmware-root-1021770424 .. orbit-gdm virtual-root.oIRpqV .X0-lock .esd-0 orbit-root virtual-root.SYzvds .X11-unix fcoemon.dcbd.1877 pulse-6RxxukyDViKG virtual-root.TxohH3 yum.log fcoemon.dcbd.1882 pulse-7uPELLDblazM vmware-config0 .ICE-unix pulse-KkJ8rZQQObou VMwareDnD keyring-JlrKWR .rnd vmware-root sftp> exit
SCP:文件异地直接复制
参数:
-p:保留文件原有的权限信息
-r:复制来源为目录时,可以复制整个目录
-l:可以限制传输的速率,单位为 kbits/s,例如[-l 800] 代表传输速率100kbytes/s[root@CentOS ~]# scp [-pr] [-l 速率] file [账号@]主机:目录名 # 上传 [root@CentOS ~]# scp [-pr] [-l 速率] [账号@]主机:file 目录名 # 下载 # 将本机的 /etc/hosts* 全部复制到127.0.0.1 上面的 student 用户主目录内 [root@CentOS ~]# scp /etc/hosts* student@127.0.0.1:~ The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. RSA key fingerprint is cc:73:b6:f1:0b:15:77:aa:f2:08:18:22:c8:7f:de:cb. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts. student@127.0.0.1's password: hosts 100% 165 0.2KB/s 00:00 hosts.allow 100% 370 0.4KB/s 00:00 hosts.deny 100% 460 0.5KB/s 00:00 # 将 127.0.0.1 这台远程主机的 /etc/bashrc 复制到主机的 /tmp 下面 [root@CentOS ~]# scp student@127.0.0.1:/etc/bashrc /tmp student@127.0.0.1's password: bashrc 100% 2620 2.6KB/s 00:00 # 冒号是重点,后接远程主机的文件,复制目录,可以加上-r # 假设本机有个文件名为 /etc/dd_10mb_file,这个文件有10MB这么大。假设你想要上传到 127.0.0.1 的 /tmp 中去,而且你在 127.0.0.1 上面有 root 这个账号得问使用权。但由于带宽宝贵,因此只想要分配 100kbytes 的传输量给此操作,那该使用什么样的命令语法来实现此操作 # 由于默认不存在这个文件,因此我们得先使用 dd 来建立一个大文件 [root@CentOS ~]# dd if=/dev/zero of=/root/dd_10mb_file bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.12848 s, 81.6 MB/s # 建立妥当之后,由于是上传数据,观察-l的选项中速率中用的是bit,转换成容量为bytes需要乘以8,因此指令就要这样写 [root@CentOS ~]# scp -l 800 /root/dd_10mb_file root@127.0.0.1:/tmp root@127.0.0.1's password: dd_10mb_file 100% 10MB 98.5KB/s 01:44
SSH服务器详细配置
1 . 关于 SSH Server 的整体设置,包含使用的 port ,以及使用的密码算法方式#Port 22 关于 ssh server 的整体设置,也可以使用多个 port ,即重复使用 port 这个设置项目,想要开放 sshd 在22与443,则多加一行 Port 443 即可 #Protocol 2 选择 SSH 协议版本,可以是1也可以是2.想要支持旧版V1,需要使用 Protocol 2,1 才行 #ListenAddress 0.0.0.0 监听的主机网卡,默认是监听所有接口的 SSH 要求,如果有两个IP,只想要让 192.168.1.100 可以监听 SSHD ,那就可以这样的写:ListenAddress192.168.1.100 #3PidFile /var/run/sshd.pid 可以放置 SSHD 这个PID 的文件 #LoginGraceTime 2m 当连上 SSH Server 之后,会出现输入密码的界面,在该界面中,经过多长时间内没有成功连上 SSH Server就强迫断开连接。默认为秒 #Compression delayed 指定何时开始使用压缩数据模式进行传输
2 . 说明主机的 Private Key 放置的文件,默认使用下面的文件即可
# HostKey /etc/ssh/ssh_host_key SSH version 1 使用的私钥 # HostKey /etc/ssh/ssh_host_rsa_key SSH version 2 使用的 RSA 私钥 # HostKey /etc/ssh/ssh_host_dsa_key SSH version 2 使用的 DSA 私钥
3 . 关于登录文件的信息数据放置于 daemon 的名称
# SyslogFacility AUTHPRIV 当有人使用 SSH 登录系统的时候, SSH 会记录信息,这个信息要记录在 Daemon Name 下面,默认是以 AUTH 来设置的,即 /var/log/secure 里面。其他可用的 Daemon Name 为:DAEMON、UAER、 AUTH、LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5 # LogLevel INFO 日志的等级
4 . 安全设置项目
4.1 登录设置bufen # PermitRootLogin yes 是否允许 root 登录。默认允许 # StrictModes yes 是否让 sshd 去检查用户主目录或相关文件的权限数据,当用户的~.ssh/ 权限设置错误时,某些特殊情况下回不许用户登录 # PubkeyAuthentication yes # AuthorizedKeysFile .ssh/authorized_keys 是否允许用户自行使用成对的密钥进行登录,仅针对 Version 2,至于自定义的公钥数据就放置在用户目录下的 /ssh/authorized_keys 内 # PasswordAuthentication yes 密码验证当然是需要的 # PermitEmptyPasswords no 是否允许空密码登录 4.2 认证部分 # RhostsRSAAuthentication no 本机系统不使用 .rhosts,因为仅适用于 .rhosts 太不安全了,所以这里一定要设置为 no # IgnoreRhosts yes 是否取消使用 ~/.ssh/.rhosts 来作为认证,当然选择是 # RhostsRSAAuthentication no # 这个选项是专门给 Version 1 用的,使用 rhosts 文件在 /etc/hosts.equiv配合 RSA 加密算法来进行认证,不要使用 # HostbasedAuthentication no 这个类似于上面的那个,是给Version 2 使用的 # IgnoreUserKnownHosts no 是否忽略用户主目录内的 ~/.ssh/known_hosts 这个文件所记录的主机内容,当然不忽略 # ChallengeResponseAuthentication no 允许任何的密码认证所以任何 login.conf 规定的认证方式均可使用,但我们比较喜欢使用 PAM 模块帮忙管理,所以选择 no # UsePAM yes 利用 PAM 模块 管理用户认证有很多好处,可以记录与管理,所以建议我们使用 UsePAM 且 ChallengeResponseAuthentication 设置为 no 4.3 与 Kerberos 有关的参数设置,因为我们没有 Kerberos 主机,所以下面的不用设置 #KerberosAuthentication nobody #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #KerberosTgtPassing no 4.4 下面是有关在X-wondows 下面使用的设置 # X11Forwarding yes # X11DisplayOffset 10 #X11UseLocalhost yes 比较重要的是 X11Forwarding 项目,它可以让窗口的数据通过 SSH 连接来传送 4.5 登录后的项目 #PrintMotd yes 登录后是否打印出 /etc/motd 这个文件的内容,默认是yes,为了安全可以改为 no # PrintLastLog yes 显示上次登录的信息 # TCPKeepAlive yes 当实现连接后,服务器会一直发送 TCP 数据包给客户端,用以判断对方是否一直存在,任何一端掉线,SSH 会立刻知道,而不会出现僵尸进程。如果网络不稳定,也可以改为 no # UsePrivilegeSeparation yes 是否使用权限较低的程序来提供用户操作。我们知道SSHD启动的端口是22,这个是系统进程,是root 身份,那么当student登录后,这个设置值会产生一个属于student的SSHD程序来使用 # MaxStartups 10 同事允许几个尚未登录的界面,连上 ssh 但是未输入密码的就是连接界面 4.6 关于用户限制的设置项目 # DenyUsers * 设置被限制用户的名称,如果是全部用户,那就全部阻挡,如果是部分使用者,可以将该账号填入。例如 DenyUsers test # DenyUsers test 仅阻挡几个组
5 . 关于 SFTP 服务与其他的设置项目
# Subsystem sftp /usr/lib/ssh/sftp-server # UseDNS yes 一般来说,为了判断客户端来源是否正常合法,会使用 DNS 去反查客户端的主机名,不过如果是内网互联,这个项目设置为 no 会让连接速度更快
制作不用密码可立即登录的 SSH 用户
既然 SSH 可以使用密钥系统来对比数据,并且提供用户数据的加密功能,那么可不可能利用这个Key就提供用户自己进入主机,而不需要输入密码呢?步骤:
客户端建立两把钥匙。利用命令 ssh-keygen
客户端放置好私钥文件。将私钥放在客户端的用户主目录。 $HOME/.SSH/
将公钥放置到服务器端的正确目录与文件中。放在用户的主目录内的 .ssh/ 里面
1 . 客户端建立两把钥匙# 在客户端上面以kevin的身份建立两把钥匙,如不指定算法,默认 RSA [kevin@CentOS ~]$ ssh-keygen [-t rsa|dsa] [kevin@CentOS ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/kevin/.ssh/id_rsa): #回车键 Enter passphrase (empty for no passphrase): #回车键 Enter same passphrase again: #回车键 Your identification has been saved in /home/kevin/.ssh/id_rsa. #私钥文件 Your public key has been saved in /home/kevin/.ssh/id_rsa.pub. #公钥文件 The key fingerprint is: 50:ff:ae:58:8c:33:d5:a4:de:42:37:1f:13:c1:00:69 kevin@CentOS.virtual [kevin@CentOS ~]$ ls -ld ~/.ssh; ls -l ~/.ssh drwx------. 2 kevin kevin 4096 Apr 9 06:52 /home/kevin/.ssh total 8 -rw-------. 1 kevin kevin 1675 Apr 9 06:52 id_rsa #私钥文件 -rw-r--r--. 1 kevin kevin 402 Apr 9 06:52 id_rsa.pub #公钥文件
2 . 将公钥文件数据上传到服务器上
[kevin@CentOS ~]$ scp ~/.ssh/id_rsa.pub root@192.168.1.112:~ The authenticity of host '192.168.1.112 (192.168.1.112)' can't be established. RSA key fingerprint is b8:b2:70:cd:62:01:39:22:d8:1c:7d:8e:e3:2e:db:fa. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.112' (RSA) to the list of known hosts. root@192.168.1.112's password: id_rsa.pub 100% 402 0.4KB/s 00:00
3 . 将公钥放置到服务器端的正确目录与文件名
# 1. 建立 ~/.ssh 文件,注意权限需要为700 [root@CentOS ~]# ls -ld .ssh # 不存在则新建 [root@CentOS ~]# mkdir .ssh; chmod 700 .ssh [root@CentOS ~]# ls -ld .ssh # 2 . 将公钥文件内的数据使用 cat 转存到 authorized_keys 内 [root@CentOS ~]# ls -l *pub -rw-r--r--. 1 root root 402 Apr 9 18:58 id_rsa.pub [root@CentOS ~]# cat id_rsa.pub >> .ssh/authorized_keys [root@CentOS ~]# chmod 644 .ssh/authorized_keys [root@CentOS ~]# ls -l .ssh total 4 -rw-r--r--. 1 root root 402 Apr 9 19:03 authorized_keys
客户端必须制作出公钥和私钥者这两把密钥,且私钥需要放到 ~/.ssh/ 内。
服务器必须要有公钥,且反知道用户主目录下的 ~/.ssh/authorized_keys, 同时目录的权限(.ssh/)必须是700而文件权限必须为644,同时文件的属主与数组都必须与该账号吻合才行简易安全设置
1 . 服务器软件本身的设置强化:/etc/ssh/sshd_config
禁止 root 这个账号使用 SSHD 的服务
禁止 nossh 这个组的用户使用 SSHD 的服务
禁止 testssh 这个用户使用 SSHD 的服务# 先观察一下所需要的账号是否存在 [root@CentOS ~]# for user in sshnot1 sshnot2 sshnot3 testssh studnet; do id $user | cut -d ' ' -f1-3 ; done # 修改 sshd_config 并且重新启动 sshd PermitRootLogin no #39行 DenyGroups nossh DenyUsers testssh [root@CentOS ~]# /etc/init.d/sshd restart # 测试与观察相关账号的登录情况 [root@CentOS ~]# ssh root@localhost [root@CentOS ~]# ssh sshnot1@localhost [root@CentOS ~]# tail /var/log/secure [root@CentOS ~]# ssh testssh@localhost [root@CentOS ~]# tail /var/log/secure
2 . /etc/hosts.allow 及 /etc/hosts.deny
[root@CentOS ~]# vim /etc/hosts.allow sshd : 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0 [root@CentOS ~]# vim /etc/hosts.deny sshd : ALL
3 . iptables 数据包过滤防火墙
[root@CentOS ~]# vim /usr/local/virus/iptables/iptables.allow iptables -A INPUT -i $EXTIF -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT [root@CentOS ~]# vim /usr/local/virus/iptables/iptables.rule
基于密钥的认证
基于密钥的认证: 一台主机为客户端(基于某个用户实现): 1、生成一对密钥 ssh-keygen -t {rsa|dsa} -f /path/to/keyfile -N 'password' 2、将公钥传输至服务器端某用户的家目录下的.ssh/authorized_keys文件中 使用文件传输工具传输(ssh-copy-id, scp) ssh-copy-id -i /path/to/pubkey USERNAME@REMOTE_HOST 3、测试登录
# 本地用户生成密钥 [kevin@CentOS ~]$ man ssh-keygen [kevin@CentOS ~]$ ssh-keygen -t rsa #默认会保存在用户家目录下的.ssh下,也可以手动指定 [kevin@CentOS ~]$ ll -a drwx------. 2 kevin kevin 4096 Apr 21 13:27 .ssh #注意目录权限 # 删除密钥,重新生成 [kevin@CentOS ~]$ rm -rf .ssh/* [kevin@CentOS ~]$ ssh-keygen -t rsa -f .ssh/id_rsa # 将公钥传输至服务器端 [kevin@CentOS ~]$ ssh-copy-id -i .ssh/id_rsa root@192.168.1.109
基于密钥认证
# 创建密钥文件 Xshell --> 工具 --> 新建用户密钥生成向导 --> RSA 1024 --> 输入密码 --> 导出到本地(公钥文件) --> 传到 linux中root根目录即可( id_rsa_1024.pub) --> 追加到/root [root@CentOS ~]# cat id_rsa_1024.pub >> .ssh/authorized_keys # 退出登录,重新连接 ssh 192.168.1.109 输入用户root 密码选择公钥,选择文件但不用输入
总结
总结: 1、密码应该经常换且足够复杂; 2、使用非默认端口; 3、限制登录客户地址; 4、禁止管理直接登录; 5、仅允许有限制用户登录; 6、使用基于密钥的认证; 7、禁止使用版本1
鸟哥的服务器《十一》SSH服务器
最新推荐文章于 2024-04-14 09:54:10 发布