SSH服务
ssh服务简单介绍
SSH协议框架中最主要的部分是三个协议:
*传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性等的支持;
*用户认证协议(The User Authentication Protocol)则为服务器提供客户端的身份鉴别;
*连接协议(The Connection Protocol)将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用;各种高层应用协议可以相对地独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。
同时SSH协议框架中还为许多高层的网络安全应用协议提供扩展的支持。它们之间的层次关系可以用如下图来表示:
一,ssh建立链接过程
1.服务器上产生公钥 2.客户端带着私钥访问服务器 3.服务器上公钥返回给客户端,并且用自己的公钥和客户端发来的私钥生成key pair 4.客户端再次带着自己的私钥和服务器发来的公钥生成key pair访问服务器 5.服务器用自己的key pair和客户端的key pair进行比对,建立链接 注意: 在第一次链接的时候,会在本地生成密钥文件/.ssh/known_hosts(可以存放多个)
二,ssh生成密钥对过程
1.客户端 ssh-keygen -t dsa 生成2个文件,id_dsa(私钥),id_dsa_pub(公钥) 2.客户端 发送公钥到服务器端 3.客户端 带着公钥发送链接请求 4.验证公钥 5.服务器 用公钥加密质询,发送至客户端 6.客户端 用私钥解密质询 7.客户端 将解密后的质询发送回服务器 8.服务器 验证质询 9.验证通过,链接建立
三,sshd_config配置文件可修改地方
1.#Port 22 2.PermitRootLogin yes 默认是打开的,就是允许客户端用root链接 3.#PermitEmptyPasswords no 是否允许空密码 下面是可以解决链接慢 1.UseDNS no 拒绝域名解析 2.GSSAPICleanupCredentials no
四,客户端链接ssh基本语法
1.指定端口的链接,会跳到链接的机子上 ssh -p22 user@ip -p指定端口,默认即位22 2.在链接的机子上执行命令,不会跳到链接的机子上 ssh -p22 user@ip command
五,基于ssh加密的scp命令
1.推:scp -P22 /etc/file user@ip:/tmp -P这个指定端口是大写p 2.拉:scp -P22 user@ip:/tmp/file /etc/ 3.参数介绍: -r递归,表示拷贝目录 -p表示拷贝前后保持文件目录属性 -l limit限制速度 通常scp -P22 -rp 即可 4.scp每次都是全量的拷贝,不同于rsync的增量
六,基于ssh加密的sftp远程上传下载(不推荐用,因为可以使用命令)
1.sftp -oPort=22 user@ip oPort指定端口 2.上传本地文件到远程主机 当我们链接上的时候,可以通过ls查看当前目录文件 通过,put /etc/file /tmp 将本地的file上传到远程主机的/tmp目录 默认如果不加/tmp,发送到/root目录下 3.下载远程主机文件到本地 通过,get /etc/file /tmp 将远程主机上的file文件下载到/tmp下 默认如果不加/tmp,下载到我们开始执行链接命令的目录下
七,非交互式创建密钥
我们手动创建是通过,ssh-keygen -t dsa,然后回车 1.自动创建 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa > /dev/null 2>&1 2.将公钥发送到远程主机 ssh-copy-id -i .ssh/id_dsa.pub "-p22 user@ip" 发送过去后,远程主机会产生.ssh/authorized_keys文件,权限是600,本地会多出.ssh/known_hosts文件
八,提权执行
1.直接root账号,将sshd_config里面允许root登录 2.sudo提权实现没有权限的用户拷贝 首先,配置sudoers:
终端命令;visudo,相当于配置/etc/sudoers ## Allow root to run any commands anywhere
用户或者组 机器=授权角色 可执行命令 root ALL=(ALL) ALL joker ALL=(ALL) /usr/bin/rsync
@group ALL=(ALL) ALL
user ALL=(ALL) NOPASSWD:ALL 解释:
第一个ALL代表机器,就是所有机器,第二个ALL代表所有角色,第三个ALL代表可以执行所有命令,NOPASSWD代表提权命令时不需要提示密码
然后,加载sudoers文件 visudo -C 最后,用joker用户通过基于ssh的rsync发送文件
用户或者组在执行授权的特殊权限命令时后格式为sudo 命令,切换到root格式为 sudo su - ,需要输入当前用户的密码,而不是root密码 ssh -p22 -t user@ip sudo rsync ~/hosts /etc/hosts
注意;
如果,提示命令找不到,很可能是环境变量导致
root下,echo $path
user下,echo $path
在user下,修改vi ~/.bash_profile,将/usr/local/sbin:/sbin:/usr/sbin加入进去 3.利用suid实现没有权限用户拷贝(了解即可) chmod u+s 'which rsync'
附赠基于ssh的scp推送脚本
#!/bin/bash if [ $# -ne 2 ];then echo "usage:/bin/bash $0 {avg1 avg2}" exit 1 fi . /etc/init.d/functions for ip in 1 2 3 do scp -p22 file user@ip:/tmp > /dev/null 2&1 if [ $? -eq 0 ];then action "fenfa hosts ip" /bin/true else action "fenfa hosts ip" /bin/false fi done
九,非交互模式产生密钥
1.yum install expect -y 2.mkpasswd -l 10 参数介绍,生成随机字符串,-l是指生成多少个字符 3.简单介绍expect的过程 首先,还是需要手动ssh-keygen生成私钥,公钥 然后,spawn ssh-copy-id -i id_dsa.pub "-p 22 user@ip" expect { "yes/no" {send "yes\r":exp_continue} "*password" {send "123\r"} } expect eof
附赠基于expect免密钥分发脚本
#!/bin/bash # The author is joker, which is used to manage the host. expect_order=`which expect 1>/dev/null 2>&1` if [ $? -eq 1 ];then yum install expect -y sleep 1 sh $0 else Distribute(){ for IP in $(cat /service/script/distribute_ip.txt);do Passwd=$1 USER=$2 expect -c " spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 $USER@$IP expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password*\" {send \"$Passwd\r\";exp_continue} \"*password*\" {send \"$Passwd\r\";} } " if [ $? -eq 0 ];then echo -e "\033[32m 绿色字,ssh $IP 链接成功 \033[0m" else echo -e "\033[31m 红色字,ssh $IP 链接失败,请检查原因 \033[0m" fi done } Distribute "Poppy1115" root fi ########################################### # distribute_ip.txt,注意该文件适合在同一个地区使用,内网互动,否则去除内网地址 # 外网地址 内网地址