git ssh https 踩坑记 —- 域账号密码更新

前几天突然通知要更新公司的域账号密码,然后git pull就一直报

fatal: Authentication failed for ‘https://git ...

很奇怪的是,有一个项目git pull push都是好的。

上网查了下用以下命令可以看到

git remote get-url origin

好的项目是用了ssh,不好的项目用的是https,https把旧的密码存到电脑里了,所以一直登陆不上

解决方法1–修改密码:

// 清除账户密码缓存
git config --system --unset credential.helper
// 设置账户密码永久保存
git config --global credential.helper store
// 拉代码,重新输入账号密码登陆一次,以后再也不用再输账号密码
git pull

解决方法2–改用ssh方式认证:

// 去除https源
git remote remove origin
// 添加ssh远端源
git remote add origin git@git.xxx.cn:xxx/xxx.git

ps: 值得注意的是更换origin后,分支要和远端重新关联一下

git branch --set-upstream-to=origin/dev

git设置ssh访问

生成新的ssh密钥

进入根目录的.ssh里,没有也行,生成文件名时会生成目录的

cd ~/.ssh

生成文件名和文件位置

ssh-keygen -t rsa -C "github" -f id_rsa_github

指定生成的文件名是id_rsa_github
指定备注是github
密码一般为空即可
此时的~/.ssh目录下会有:

id_rsa_github 私钥文件

id_rsa_github.pub 公钥文件
再把key加到ssh-agent里

Start the ssh-agent in the background.

eval "$(ssh-agent -s)"
Agent pid 59566

If you‘re using macOS Sierra 10.12.2 or later, you will need to modify your ~/.ssh/config file to automatically load keys into the ssh-agent and store passphrases in your keychain.

Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa

ssh-add -K ~/.ssh/id_rsa

再把.pub里的加到github的ssh key里
注意:生成的文件名是什么,加到config里的file名字就用自己生成的,ssh-add的也是

此时git clone git://地址 就OK了

参考地址
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key

Linux 防火墙 阻止ssh暴力测试

Fedora CentOS 系统下有效

安装fail2ban服务

dnf install fail2ban -y

设置开机启动

systemctl enable fail2ban

启动服务

systemctl start fail2ban

编辑文件

vim /etc/fail2ban/jail.conf

...
...
...

[ssh]
enabled = true
filter   = sshd
logpath = /var/log/secure
maxretry = 1
findtime = 300
bantime = 86400
ignoreip = 192.168.1.1/24,192.168.0.1/24

重启fail2ban

systemctl restart fail2ban

解决ssh无法连接远程Ubuntu,Uuntu安装ssh-server

ssh无法连接Ubuntu原因:

Ubuntu安装完成默认情况下,只安装了ssh-client,也就是说你可以在该Ubuntu下用ssh连接其它服务器,但是没有安装ssh-server,因此你无法连接到此Ubuntu上,解决办法就是安装ssh-server。

一、安装ssh

命令:

sudo apt-get install openssh-server -y

二、查看ssh服务是否启动

命令:

sudo ps -e |grep ssh

#如果显示有sshd 这一项说明,说明ssh已经启动成功,到此结束。那么你可以远程连接ssh了。

#如果没有sshd、只有ssh-agent,说明ssh启动失败,需要配置,继续完成后续步骤。

三、启动ssh服务

sudo service ssh start  或 /etc/init.d/ssh restart

命令执行完成后,重复一次第二步,看看ssh是否启动成功。如果依旧没有启动成功,那么继续完成后续步骤。

四、修改ssh配置文件

命令:

vi /etc/ssh/ssh_config

#编辑配置文件,大约在39,40行,将这两句代码前的#取消掉保存退出。

Port 22

Protocol 2,1

五、重启Ubuntu

到这一步本人试过多次,启动、重启ssh服务依然失败,但重启一下Ubuntu就好了,。不知道这是什么鬼,但是屡试不爽,不妨试一下。

ssh还不能登录上,就修改sshd的默认配置

ssh出现permission denied (publickey)问题:

修改/etc/ssh/sshd-config文件.

PubkeyAuthentication yes修改为no

centos7 ssh 免密登录

  • Public Key认证的主要魅力在于认证时承诺不必提供密码就能够同远程系统建立连接。
  • Public Key认证的基础在于一对密钥,public key和private key,public key对数据进行加密而且只能用于加密,private key 只能对所匹配的public key加密过的数据进行解密。
  • 我们把public key放在远程系统合适的位置,然后从本地开始进行ssh连接。
  • 此时,远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地,本地会用private key进行解密并把这个随机数发回给远程系统。
  • 最后,远程系统的sshd会得出结论我们拥有匹配的private key允许我们登录。

一、serverA 免密登录 serverB 原理

  1. 首先在 serverA 上生成一对秘钥(ssh-keygen)
  2. 将公钥拷贝到 serverB,重命名 authorized_keys
  3. serverA 向 serverB 发送一个连接请求,信息包括用户名、ip
  4. serverB 接到请求,会从 authorized_keys 中查找,是否有相同的用户名、ip,如果有 serverB 会随机生成一个字符串
  5. 然后使用使用公钥进行加密,再发送个 serverA
  6. serverA 接到 serverB 发来的信息后,会使用私钥进行解密,然后将解密后的字符串发送给 serverB
  7. serverB 接到 serverA 发来的信息后,会给先前生成的字符串进行比对,如果一直,则允许免密登录

二、Centos7 默认安装了 ssh服务

三、启动 ssh 服务

# 查看 ssh 状态
systemctl status sshd
# 启动 ssh
systemctl start sshd
# 停止 ssh
systemctl stop sshd

四、serverA 生成秘钥,遇到提示直接敲回车即可

CentOS7 默认使用RSA加密算法生成密钥对,保存在~/.ssh目录下的id_rsa(私钥)和id_rsa.pub(公钥)。也可以使用“-t DSA”参数指定为DSA算法,对应文件为id_dsa和id_dsa.pub,密钥对生成过程会提示输入私钥加密密码,可以直接回车不使用密码保护。

ssh-keygen

五、移动 id_rsa.pub 文件

# 方法一
# 将 serverA ~/.ssh目录中的 id_rsa.pub 这个文件拷贝到你要登录的 serverB 的~/.ssh目录中 scp 
~/.ssh/id_rsa.pub 192.168.0.101:~/.ssh/ 
# 然后在 serverB 运行以下命令来将公钥导入到~/.ssh/authorized_keys这个文件中 
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
# 另外要注意请务必要将服务器上 ~/.ssh权限设置为700 
~/.ssh/authorized_keys的权限设置为600 #
这是linux的安全要求,如果权限不对,自动登录将不会生效
# 方法二
ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

七、验证免密登录

ssh root@serverB

八、无法登陆原因分析

  1. 请检查文件和目录权限是否正确,我就遇到了一台服务器之前谁把root下的 .ssh 文件夹给了mysql用户和用户组不知道是什么操作,很无语..
  2. 查看配置文件 ,是不是没有启用秘钥登录
  3. 查看日志 tail -f /var/log/secure , 定为错误原因

ssh 免密码登陆以及简化命令

第一部分 SSH无密码登录的设置步骤

首先我们在自己的Linux系统上生成一对SSH Key:SSH密钥和SSH公钥.密钥保存在自己的Linux系统上。

然后公钥上传到Linux服务器.之后我们就能无密码SSH登录了.SSH密钥就好比是你的身份证明.

1、在自己的Linux系统上生成SSH密钥和公钥

打开终端,使用下面的ssh-keygen来生成RSA密钥和公钥.-t表示type,就是说要生成RSA加密的钥匙.

ssh-keygen -t rsa

RSA也是默认的加密类型.所以你也可以只输入ssh-keygen.默认的RSA长度是2048位.如果你非常注重安全,那么可以指定4096位的长度.

ssh-keygen -b 4096 -t rsa

生成SSH Key的过程中会要求你指定一个文件来保存密钥,按Enter键使用默认的文件就行了.然后需要输入一个密码来加密你的SSH Key.密码至少要20位长度.SSH密钥会保存在home目录下的.ssh/id_rsa文件中.SSH公钥保存在.ssh/id_rsa.pub文件中.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/matrix/.ssh/id_rsa):  按Enter键
Enter passphrase (empty for no passphrase):   输入一个密码
Enter same passphrase again:   再次输入密码
Your identification has been saved in /home/matrix/.ssh/id_rsa.
Your public key has been saved in /home/matrix/.ssh/id_rsa.pub.
The key fingerprint is:
e1:dc:ab:ae:b6:19:b0:19:74:d5:fe:57:3f:32:b4:d0 matrix@vivid
The key's randomart image is:
+---[RSA 4096]----+
| .. |
| . . |
| . . .. . |
| . . o o.. E .|
| o S ..o ...|
| = ..+...|
| o . . .o .|
| .o . |
| .++o |
+-----------------+

查看.ssh/id_rsa文件就会看到,这个文件是经过加密的(encrypted).也就是用你输入的密码来加密.

less .ssh/id_rsa

未分类

2、将SSH公钥上传到Linux服务器

可以使用ssh-copy-id命令来完成.

ssh-copy-id username@remote-server

未分类

输入远程用户的密码后,SSH公钥就会自动上传了.SSH公钥保存在远程Linux服务器的.ssh/authorized_keys文件中.

上传完成后,SSH登录就不需要再次输入密码了.但是首次使用SSH Key登录时需要输入一次SSH密钥的加密密码.(只需要输入一次,将来会自动登录,不再需要输入密钥的密码.)

使用scp命令来传送文件时也不需要输入密码.

SSH Key的知识

Linux系统有一个钥匙环(keyring)的管理程序.钥匙环受到用户登录密码的保护.当你登录Linux系统时,会自动解开钥匙环的密码,从而可访问钥匙环.SSH的密钥和公钥也存储在钥匙环.所以初次使用SSH密钥登录远程Linux服务器时需要输入一次SSH密钥的密码.而将来使用SSH密钥登录时不再输入密码.Ubuntu的钥匙环程序是seahorse.

SSH密钥就好比是你的身份证明.远程Linux服务器用你生成的SSH公钥来加密一条消息,而只有你的SSH密钥可以解开这条消息.所以其他人如果没有你的SSH密钥,是无法解开加密消息的,从而也就无法登录你的Linux服务器。

第二部分 使用用户指定的 SSH 配置文件

通过你最喜欢的编辑器来打开配置文件:

$ vim ~/.ssh/confi 

ssh 配置文件的详细解释:

  • HostName – 定义真正要登录的主机名,此外,你也可以使用数字 IP 地址,不管是在命令行或是 HostName 定义中都允许使用其中任一种。
  • User – 指定以哪一个用户来登录。
  • Port – 设置连接远程主机的端口,默认是 22 端口。但必须是远程主机的 sshd 配置文件中定义的端口号。
  • Protocol – 这个选项定义了优先使用 ssh 支持的协议版本。常用的值为 ‘1’ 和 ‘2’,同时使用两个协议版本则必须使用英文逗号隔开。
  • IdentityFile – 指定一个用于读取用户 DSA、Ed25519、ECDSA 等授权验证信息的文件。
  • ForwardX11 – 定义 X11 连接是否自动重定向到安全通道和 DISPLAY 设置。有两个可以设置的值,即 yes 或 no。
  • Compression – 默认值为 no,如果设置为 yes,则在连接远程主机过程中使用压缩进行传输。
  • ServerAliveInterval – 设置当没有收到服务器响应 (或者数据))时的超时时间,单位为秒,ssh 会通过加密信道发送信息,请求服务器响应。默认值为 0,这意味着 ssh 不会向服务器发送响应请求;如果定义了 BatchMode 选项,则默认是 300 秒。
  • ServerAliveCountMax – 设置服务器在没有接收到服务器的任何响应时,由服务器发送的活动信息数量。
  • LogLevel – 定义 ssh 登录信息的的日志冗余级别。允许的值为:QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2 和 DEBUG3,默认为 INFO。

使用ssh配置之后可以使用

$ ssh centos7

链接服务器~

SSH的安全设置

前言

在阿里云部署了一台虚拟主机,安装了zabbix,主要用于监控用户WIFI系统,平常很少登录;今天登录查看某些配置时,系统提示如下:

未分类

竟然有840次试图登录系统,真是有些担忧,需要马上加强安全。

安全加固

Linux中sshd服务的验证方式一般有2种:密码和密钥认证,平时用的最多的就是密码认证,这台zabbix的云主机就是使用密码认证,并且允许root直接远程登录;这台云机只有本人在访问,可以随意设置。

此次加固的方法:
禁用root用户远程登录,使用普通用户登录
修改为密钥认证

既然要修改为密钥登录,肯定需要一对密钥了,先介绍一下使用x-shell如何生成密钥对

生成密钥对

启动x-shell程序,tools->User Key Manager

未分类

未分类

未分类

未分类

未分类

未分类

未分类

这样密钥对生成完毕,等会需要将生成的公钥信息复制粘贴到用户的家目录内.ssh/authorized_keys文件内。

创建普通用户及授权文件

# 创建用户   
useradd yxq

# 设置账号密码 
passwd yxq

# su到普通用户yxq
su - yxq

# 用户家目录下创建.ssh目录
mkdir .ssh

# 创建授权文件并将生成的公钥信息复制到文件内
vim .ssh/authorized_keys 

sh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuTNmA/jofPrDhbChITDHpaWlt6UeD/rA/xzIckwOXdBCFDow87XsTnRtUeFZkQyH4PXgWfkSbEA7OKDvIRi0OfIUgGDf1ST1hUQRaEKnN1peKCCOZN0F6p3l6dyQHZ8BMtofmnWNRznOm/VO4I/h85LX6PPJJNxLXphyQKZIGaF4kuV6etgAMS5sqLfxfythJ6DFR4NQoxWbzYXgH+GKljvJ+8b/+SUNx07j5Lmbn0Q6CPX7Mrm7w2yKU26KfpR5yb476VZRMEpm6+UdBQ4G6pBk5rXhJ+iZ4oKPDxseydkIZZvtKO4z2uMbUcnfnd+NfSMPg1dZkwIpoI9Gy3mU/Q==

修改SSH服务的配置

修改配置文件/etc/ssh/sshd_config

vim /etc/ssh/sshd_config      
# 禁用root用户远程登录         
PermitRootLogin no   

# 禁用密码认证      
PasswordAuthentication no   

# 启用密钥认证   
PubkeyAuthentication yes   

# 密钥文件及文件路径      
AuthorizedKeysFile      .ssh/authorized_keys   

重启sshd服务

systemctl restart sshd.service   

测试

使用root登录测试

未分类

可以看到password位置是灰色的,即时将公钥也复制到root家目录下的授权文件内也是无法登录的,因为设置了root不允许远程ssh连接登录

使用yxq用户测试

未分类

在User Key的下拉菜单选择ali-yxq,点ok

未分类

提示登录成功。

解决ssh登陆过慢问题

我们经常会遇到的一个情况是telnet到server速度很快,但是ssh连接的时候却很慢,大概
要等半分钟甚至更久。ping的速度也非常好,让人误以为是ssh连接不上。
 
下面说下如何解决这样的问题,最为常见的原因是因为server的sshd会去DNS查找访问
client IP的hostname,如果DNS不可用或者没有相关记录,就会耗费大量时间。
 
1、在server上/etc/hosts文件中把你本机的ip和hostname加入
 
2、在server上/etc/ssh/sshd_config文件中修改或加入UseDNS=no,另外在authentication gssapi-with-mic也有可能出现问题,在server上/etc/ssh/sshd_config文件中修改GSSAPIAuthentication no.

3、修改server上/etc/nsswitch.conf中hosts为hosts: files //这个会导致服务器无法访问外网

4、reboot server使配置生效

/etc/init.d/sshd restart重启sshd进程使配置生效。

Linux双向SSH免密登录

原理

双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录。双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他所有机器的公钥。

步骤

假设,你有两台机器,ip分别为A和B:

总共分为三步:

  1. 生成公钥
  2. 将A机器的公钥拷贝至B机器
  3. 将B机器的公钥拷贝至A机器

1、生成公钥

如下命令生成公钥,默认会在~/.ssh/下生成id_rsa和id_rsa.pub。先检查一下机器是否已有公钥,如果没有再执行:

ssh-keygen -t rsa
  • -t 指定算法
  • -f 指定生成秘钥路径
  • -N 指定密码

2、拷贝公钥

cd ~/.ssh
scp id_rsa.pub root@B:/root/.ssh/authorized_keys #此命令在A机器执行,目的将公钥发送至B机器
scp id_rsa.pub root@A:/root/.ssh/authorized_keys #此命令在B机器执行,目的将公钥发送至B机器

scp: 加密的方式在本地主机和远程主机之间复制文件

参数:

  • 源文件:指定要复制的源文件。也可以是远程地址
  • 目标文件:目标文件。格式为user@host:filename(文件名为目标文件的名称)。

3、验证

ssh B #在A机器上,看是否免密登陆B
ssh A #在A机器上,看是否免密登陆B

如果发现设置免密登陆,还需要输入密码,那么检查一下/root.sshauthorized_keys目录和文件的权限。

chmod 600 authorized_keys 
chmod 700 .ssh

如果authorized_keys文件、$HOME/.ssh目录 或 $HOME目录让本用户之外的用户有写权限,那么sshd都会拒绝使用 ~/.ssh/authorized_keys 文件中的key来进行认证的。

vultr云主机ssh连接异常分析

vultr云主机突发莫名其妙的连接异常,ssh无法登陆,通过tcpdump抓包进行分析,特记录之。

实验准备

  • vultr云主机
  • ssh客户端
  • tcpdump抓包工具

实验步骤

客户端发起ssh连接

未分类

服务端抓包

未分类

实验分析

客户端发起TCP连接,服务端收到了三次握手的seq 1966603666包
服务器端把seq +1 返回ack 1966603667包
重点在于客户端没有收到服务器的ack确认,又重发了Flags [S], seq 1966603666
循环往复,直至SSH连接超时

那么问题来了,ACK包为啥会丢失呢?或许有一个神秘的东方力量在起作用

奇怪的是在境外的服务器可以实现SSH登录vultr主机

未分类

只有先Across the great firewall,你才能Reach every corner in the world.

后续

最初出现问题,本来计划提交工单,要求vultr解决。经过理性分析之后,放弃了这个做法,因为这个问题不是vultr能解决的。最后通过迁移主机更换IP恢复了访问。