Linux ssh命令详解 SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。 ssh服务端由2部分组成: openssh(提供ssh服务) openssl(提供加密的程序) ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接 SSH的工作机制 服务器启动的时候自己产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。 SSH的加密技术 加密技术:传输过程,数据加密。 1.SSH1没有对客户端的秘钥进行校验,很容易被植入恶意代码 2.SSH2增加了一个确认联机正确性的Diffe_Hellman机制,每次数据的传输,Server都会检查数据来源的正确性,避免黑客入侵。 SSH2支持RSA和DSA密钥 DSA:digital signature Algorithm 数字签名 RSA:既可以数字签名又可以加密 SSH知识小结 1.SSH是安全的加密协议,用于远程连接Linux服务器 2.SSH的默认端口是22,安全协议版本是SSH2 3.SSH服务器端主要包含2个服务功能SSH连接和SFTP服务器 4.SSH客户端包含ssh连接命令和远程拷贝scp命令等 如何防止SSH登录入侵 1.密钥登录,更改端口 2.牤牛阵法 3.监听本地内网IP(ListenAddress 192.168.25.*) SSH功能大全 1.登录 ssh -p22 omd@192.168.25.137 2.直接执行命令 -->最好全路径 ssh root@192.168.25.137 ls -ltr /backup/data ==>ssh root@192.168.25.137 /bin/ls -ltr /backup/data 3.查看已知主机 cat /root/.ssh/known_hosts 4.ssh远程执行sudo命令 ssh -t omd@192.168.25.137 sudo rsync hosts /etc/ 5.scp 1.功能 -->远程文件的安全(加密)拷贝 scp -P22 -r -p /home/omd/h.txt omd@192.168.25.137:/home/omd/ 2.scp知识小结 scp是加密远程拷贝,cp为本地拷贝 可以推送过去,也可以拉过来 每次都是全量拷贝(效率不高,适合第一次),增量拷贝用rsync 6.ssh自带的sftp功能 1.Window和Linux的传输工具 wincp filezip sftp -->基于ssh的安全加密传输 samba 2.sftp客户端连接 sftp -oPort=22 root@192.168.25.137 put /etc/hosts /tmp get /etc/hosts /home/omd 3.sftp小结: 1.linux下使用命令: sftp -oPort=22 root@x.x.x.x 2.put加客户端本地路径上传 3.get下载服务器端内容到本地 4.远程连接默认连接用户的家目录 ---------------------------------- ssh常见命令参数 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command] 注:详情见末尾 -------------------------------- 关于后台ssh服务的相关 # 查询openssl软件 rpm -qa openssh openssl # 查询sshd进程 ps -ef | grep ssh --> /usr/sbin/sshd # 查看ssh端口 netstat -lntup | grep ssh ss | grep ssh (效果同上,同下,好用) netstat -a | grep ssh(记住这个) netstat -lnt | grep 22 ==> 查看22端口有没有开/ssh服务有没有开启 技巧: netstat -lnt | grep ssh | wc -l -->只要大于2个就是ssh服务就是好的 # 查看ssh的秘钥目录 ll /root/.ssh/known_hosts # 当前用户家目录的.ssh目录下 # ssh的配置文件 cat /etc/ssh/sshd_config # ssh服务的关闭 service sshd stop # ssh服务的开启: service sshd start # ssh服务的重启 service sshd reload [停止进程后重启] ==> 推荐 service sshd restart [干掉进程后重启] ==> 不推荐 # ssh远程登录 ssh 192.168.1.100 # 默认利用当前宿主用户的用户名登录 ssh omd@192.168.1.100 # 利用远程机的用户登录 ssh omd@192.168.1.100 -o stricthostkeychecking=no # 首次登陆免输yes登录 ssh omd@192.168.1.100 "ls /home/omd" # 当前服务器A远程登录服务器B后执行某个命令 ssh omd@192.168.1.100 -t "sh /home/omd/ftl.sh" # 当前服务器A远程登录服务器B后执行某个脚本 ssh免密设置 1、进入用户的家目录 [root@localhost ~]# cd /root/.ssh/ 【root用户就在root目录下的.ssh目录】 [root@localhost ~]# cd /home/omd/.ssh/ 【普通用户就是在家目录下的.ssh目录】 2、根据DSA算法生成私钥和公钥【默认建立在当前用户的家目录】 [root@localhost .ssh]# ssh-keygen -t dsa # 一路回车即可 id_dsa -->私钥(钥匙) id_dsa.pub -->公钥(锁) 3.拷贝公钥给目标服务器 [root@localhost .ssh]# ssh-copy-id -i id_dsa.pub omd@192.168.25.110 【 使用ssh登录的默认端口22】 [root@localhost .ssh]# ssh-copy-id -i id_dsa.pub –p 666 omd@192.168.25.120 【使用ssh登录设置的端口666】 4. 查看目标服务器生成的文件 [omd@localhost .ssh]$ ll /home/omd/.ssh/authorized_keys 5. 免密码登录目标服务器 # ssh omd@192.168.25.110 6. 总结一下钥匙和锁的关系 1.多个钥匙开一把锁 把id_dsa.pub 复制给各个服务器 2.一个钥匙开duobasuo 把id_dsa 传给各个服务器 把id_dsa 传给自己 ------------------------ ssh排查问题 1.判断物理链路是否通 ping 192.168.25.130 线路 | 防火墙 | 是否同一个网的 ping 本身是icmp协议 2.判断服务是否正常 # telnet 192.168.25.130 22 3.Linux防火墙 # service iptables status ==> /etc/init.d/iptables status   4.打开ssh的调测进行观察 # ssh -vvv omd@192.168.1.100 ------------------------------ SSH批量分发与管理方案小结 1.利用root做ssh key验证 优点:简单,易用 缺点:安全性能差,无法禁止root远程连接 2.利用普通用户omd -->推荐 思路:把要分发的文件拷贝到服务器用户的家目录,然后利用sudo提权拷贝分发的文件和对应目录 优点:安全 缺点:复杂,配置麻烦 1.sudo提权 echo 'omd All=(All) NOPASSWD:/usr/bin/rsync' >> /etc/sudoers visudo -c grep omd /etc/sudoers 2.ssh分发到服务器的家目录 ssh -p22 -r /etc/hosts omd@192.168.25.137:~ 3.ssh使用sudo复制到目标服务器的/etc ssh -t omd@192.168.25.137 sudo rsync hosts /etc/ 3.拓展方案2,不用sudo,而是设置suid对固定命令提权 优点:相当安全 缺点:复杂,安全性较差,任何人都可以处理带有suid权限的命令 1.which rsync 2.chmod 4755 /usr/bin/rsync ------------------------- ssh章节小结 1.ssh远程的加密连接协议,相关软件openssh,openssl 2.默认端口22 3.ssh版本协议 4.服务器ssh连接,ftp连接,sshd守护进程,开机启动 5.ssh客户端重要命令:ssh(用户登录&&远程命令),scp,sftp, 6.安全验证方式:口令,密钥 学习原理 7.ssh服务优化:改端口,改监听,no root,no empty,no DNS, 8.ssh密钥对,公钥在服务器端,私钥在客户端 ------------------------------ 修改ssh服务的启动文件sshd的几个点 1-1修改 /etc/ssh/sshd_config
GSSAPIAuthentication yes 解决一台服务器管理多个ssh服务 UseDNS no 加快响应速度因为在内网环境下 PermitRootLogin no 不运行root用户直接登录 Port 11544 更改访问端口号 ListenAddress 192.168.25.130 只监听内网的IP Match User anoncvs 当前环境允许登录的用户 PermitRootLogin no 是否允许root用户登录,一般不允许开 1-2重启服务 service sshd restart 写入命令进内存 service sshd reload(优先) reload是一个平滑的访问,不影响用户使用 1-3查看连接端口 netstat -an | grep EST ------------------------------ SSH跳过HostKeyChecking,不用输入yes SSH跳过输入ssh跳过RSA key fingerprint输入yes/no 在配置大量的节点之间需要ssh连通的时候,如果自动复制很多节点,都需要输入yes,两两节点之间都要互通一次,这样会造成很大的麻烦 解决;修改配置文件/etc/ssh/ssh_config 找 到 # StrictHostKeyChecking ask 修改为:StrictHostKeyChecking no ------------------------------ ssh-keygen参数说明 ssh-keygen - 生成、管理和转换认证密钥 ssh-keygen [-q] [-b bits] -t type [-N new_passphrase] [-C comment] [-foutput_keyfile] ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile] ssh-keygen -i [-f input_keyfile] ssh-keygen -e [-f input_keyfile] ssh-keygen -y [-f input_keyfile] ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile] ssh-keygen -l [-f input_keyfile] ssh-keygen -B [-f input_keyfile] ssh-keygen -D reader ssh-keygen -F hostname [-f known_hosts_file] ssh-keygen -H [-f known_hosts_file] ssh-keygen -R hostname [-f known_hosts_file] ssh-keygen -U reader [-f input_keyfile] ssh-keygen -r hostname [-f input_keyfile] [-g] ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point] ssh-keygen -T output_file -f input_file [-v] [-a num_trials] [-W generator] ssh-keygen 用于为 生成、管理和转换认证密钥,包括 RSA 和 DSA 两种密钥。 密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。 ssh-keygen 还可以用来产生 Diffie-Hellman group exchange (DH-GEX) 中使用的素数模数。 参见模数和生成小节。 一般说来,如果用户希望使用RSA或DSA认证,那么至少应该运行一次这个程序, 在 ~/.ssh/identity, ~/.ssh/id_dsa 或 ~/.ssh/id_rsa 文件中创建认证所需的密钥。 另外,系统管理员还可以用它产生主机密钥。 通常,这个程序产生一个密钥对,并要求指定一个文件存放私钥,同时将公钥存放在附加了".pub"后缀的同名文件中。 程序同时要求输入一个密语字符串(passphrase),空表示没有密语(主机密钥的密语必须为空)。 密语和口令(password)非常相似,但是密语可以是一句话,里面有单词、标点符号、数字、空格或任何你想要的字符。 好的密语要30个以上的字符,难以猜出,由大小写字母、数字、非字母混合组成。密语可以用 -p 选项修改。 丢失的密语不可恢复。如果丢失或忘记了密语,用户必须产生新的密钥,然后把相应的公钥分发到其他机器上去。 RSA1的密钥文件中有一个"注释"字段,可以方便用户标识这个密钥,指出密钥的用途或其他有用的信息。 创建密钥的时候,注释域初始化为"user@host",以后可以用 -c 选项修改。 密钥产生后,下面的命令描述了怎样处置和激活密钥。可用的选项有: -a trials 在使用 -T 对 DH-GEX 候选素数进行安全筛选时需要执行的基本测试数量。 -B 显示指定的公钥/私钥文件的 bubblebabble 摘要。 -b bits 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。 -C comment 提供一个新注释 -c 要求修改私钥和公钥文件中的注释。本选项只支持 RSA1 密钥。 程序将提示输入私钥文件名、密语(如果存在)、新注释。 -D reader 下载存储在智能卡 reader 里的 RSA 公钥。 -e 读取OpenSSH的私钥或公钥文件,并以 RFC 4716 SSH 公钥文件格式在 stdout 上显示出来。 该选项能够为多种商业版本的 SSH 输出密钥。 -F hostname 在 known_hosts 文件中搜索指定的 hostname ,并列出所有的匹配项。 这个选项主要用于查找散列过的主机名/ip地址,还可以和 -H 选项联用打印找到的公钥的散列值。 -f filename 指定密钥文件名。 -G output_file 为 DH-GEX 产生候选素数。这些素数必须在使用之前使用 -T 选项进行安全筛选。 -g 在使用 -r 打印指纹资源记录的时候使用通用的 DNS 格式。 -H 对 known_hosts 文件进行散列计算。这将把文件中的所有主机名/ip地址替换为相应的散列值。 原来文件的内容将会添加一个".old"后缀后保存。这些散列值只能被 ssh 和 sshd 使用。 这个选项不会修改已经经过散列的主机名/ip地址,因此可以在部分公钥已经散列过的文件上安全使用。 -i 读取未加密的SSH-2兼容的私钥/公钥文件,然后在 stdout 显示OpenSSH兼容的私钥/公钥。 该选项主要用于从多种商业版本的SSH中导入密钥。 -l 显示公钥文件的指纹数据。它也支持 RSA1 的私钥。 对于RSA和DSA密钥,将会寻找对应的公钥文件,然后显示其指纹数据。 -M memory 指定在生成 DH-GEXS 候选素数的时候最大内存用量(MB)。 -N new_passphrase 提供一个新的密语。 -P passphrase 提供(旧)密语。 -p 要求改变某私钥文件的密语而不重建私钥。程序将提示输入私钥文件名、原来的密语、以及两次输入新密语。 -q 安静模式。用于在 /etc/rc 中创建新密钥的时候。 -R hostname 从 known_hosts 文件中删除所有属于 hostname 的密钥。 这个选项主要用于删除经过散列的主机(参见 -H 选项)的密钥。 -r hostname 打印名为 hostname 的公钥文件的 SSHFP 指纹资源记录。 -S start 指定在生成 DH-GEX 候选模数时的起始点(16进制)。 -T output_file 测试 Diffie-Hellman group exchange 候选素数(由 -G 选项生成)的安全性。 -t type 指定要创建的密钥类型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2) -U reader 把现存的RSA私钥上传到智能卡 reader -v 详细模式。ssh-keygen 将会输出处理过程的详细调试信息。常用于调试模数的产生过程。 重复使用多个 -v 选项将会增加信息的详细程度(最大3次)。 -W generator 指定在为 DH-GEX 测试候选模数时想要使用的 generator -y 读取OpenSSH专有格式的公钥文件,并将OpenSSH公钥显示在 stdout 上。 ssh-keygen 可以生成用于 Diffie-Hellman Group Exchange (DH-GEX) 协议的 groups 。 生成过程分为两步: 首先,使用一个快速且消耗内存较多的方法生成一些候选素数。然后,对这些素数进行适应性测试(消耗CPU较多)。 可以使用 -G 选项生成候选素数,同时使用 -b 选项制定其位数。例如: # ssh-keygen -G moduli-2048.candidates -b 2048 默认将从指定位数范围内的一个随机点开始搜索素数,不过可以使用 -S 选项来指定这个随机点(16进制)。 生成一组候选数之后,接下来就需要使用 -T 选项进行适应性测试。 此时 ssh-keygen 将会从 stdin 读取候选素数(或者通过 -f 选项读取一个文件),例如: # ssh-keygen -T moduli-2048 -f moduli-2048.candidates 每个候选素数默认都要通过 100 个基本测试(可以通过 -a 选项修改)。 DH generator 的值会自动选择,但是你也可以通过 -W 选项强制指定。有效的值可以是: 2, 3, 5 经过筛选之后的 DH groups 就可以存放到 /etc/ssh/moduli 里面了。 很重要的一点是这个文件必须包括不同长度范围的模数,而且通信双方双方共享相同的模数。 ~/.ssh/identity 该用户默认的 RSA1 身份认证私钥(SSH-1)。此文件的权限应当至少限制为"600"。 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。 将在登录的时候读取这个文件。 ~/.ssh/identity.pub 该用户默认的 RSA1 身份认证公钥(SSH-1)。此文件无需保密。 此文件的内容应该添加到所有 RSA1 目标主机的 ~/.ssh/authorized_keys 文件中。 ~/.ssh/id_dsa 该用户默认的 DSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。 将在登录的时候读取这个文件。 ~/.ssh/id_dsa.pub 该用户默认的 DSA 身份认证公钥(SSH-2)。此文件无需保密。 此文件的内容应该添加到所有 DSA 目标主机的 ~/.ssh/authorized_keys 文件中。 ~/.ssh/id_rsa 该用户默认的 RSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。 将在登录的时候读取这个文件。 ~/.ssh/id_rsa.pub 该用户默认的 RSA 身份认证公钥(SSH-2)。此文件无需保密。 此文件的内容应该添加到所有 RSA 目标主机的 ~/.ssh/authorized_keys 文件中。 /etc/ssh/moduli 包含用于 DH-GEX 的 Diffie-Hellman groups 。