群晖命令集合
ssh 登录
开启ssh登录
- 登录群晖Diskstation主页
- 打开:控制面板》终端机》启用ssh功能
使用密码ssh登录
# 登录命令
ssh root@192.168.0.111
# 然后输入密码:mali**008002
ssh 证书登录
配置证书:Synology ssh证书配置
- 使用ssh账号密码登录群晖
- 生成证书
$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/jojol_synology_ssh_rsa -C jojol_synology_ssh_ca
# 上面的命令会在`~/.ssh`目录生成一对密钥:`user_ca`(私钥)和`user_ca.pub`(公钥)。
# 这个命令的各个参数含义如下。
# `-t rsa`:指定密钥算法 RSA。
# `-b 4096`:指定密钥的位数是4096位。安全性要求不高的场合,这个值可以小一点,但是不应小于1024。
# `-f ~/.ssh/user_ca`:指定生成密钥的位置和文件名。
# `-C user_ca`:指定密钥的识别字符串,相当于注释,可以随意设置。
- 下载私钥
$ scp -P22 root@192.168.0.111:/root/.ssh/jojol_synology_ssh_rsa ~/Downloads/jojol_synology_ssh_rsa
- 将公钥证书文件写到证书验证文件authorized_keys中
$ cat /root/.ssh/jojol_synology_ssh_rsa.pub >> /root/.ssh/authorized_keys
- 修改群晖ssh服务器配置文件 /etc/ssh/sshd_config
#开启RSA证书验证
RSAAuthentication yes
#开启公钥证书验证
PubkeyAuthentication yes
#公钥证书就放在这个文件里
AuthorizedKeysFile .ssh/authorized_keys
#禁用密码验证,如果为yes表示开启密码验证。开启证书验证后,这个可以关闭。
PasswordAuthentication no
#切记:刚开始设置时,PasswordAuthentication 请先保持为 yes,以防万一修改失败导致无法进入ssh,待修改证书登陆成功后,再修改为no。如果出现意外导致无法登录SSH可以使用Telnet救急
- 重启群晖 就可以用ssh 证书登录了
设置本地ssh登录配置
-
保存私钥到本地ssh目录
- 将下载的“jojol_synology_ssh_rsa”文件 保存到 “/Users/zhoujh/.ssh”
- 修改“jojol_synology_ssh_rsa”文件权限为只读
-
修改ssh配置文件: 将下面内容添加到 “/Users/zhoujh/.ssh/config”文件中
########################## synology-jojol ##########################
# s.dev
Host synology-jojol
HostName 192.168.0.111
User root
IdentityFile ~/.ssh/jojol_synology_ssh_rsa
使用证书ssh登录
$ ssh synology-jojol
# 登录成功
群晖使用Git
安装Git Server【群晖】
- 群晖套件中心 ==》搜索“git” ==〉安装Git Server
- 配置权限
开启群晖ssh登录【群晖】
创建Git根目录【群晖】
$ mkdir /volumes1/git
$ chown -R admin:administrators git
$ chmod -R 772 git
创建一个新的Git项目【群晖】
$ cd /volumes1/git
$ git init --bare --shared [my-project].git
# - [my-project] is the repository name.
# - [syn-ip-addr] is the Synology’s IP address.
克隆新项目【本地操作】
# 方式一 通过clone方式:
$ git clone ssh://[git-user]@[syn-ip-addr]/volume1/git/[my-project].git
# - [git-user] is the git user (e.g. netgloo).
# - [syn-ip-addr] is the Synology’s IP address.
# - [my-project] is the repository name.
#方式二 remote方式:
# step1 cd to project dir
$ cd [project-folder]
# step2 Create the Git repository (if there is not already one)
$ git init
$ # step3 Add the server's URL
$ git remote add origin ssh://[git-user]@[syn-ip-addr]/volume1/git/[my-project].git
$ # step4 Make the first commit and push the project on the server
$ git add --all
$ git commit -a -m "Initial commit message"
$ git push -u origin master
参考文章
文章1: SSH证书登录
前言
ssh 有密码登录和证书登录,密码登录,特别是外网的机器,很容易遭到攻击。真正的生产环境中,ssh 登录还是证书登录。目前在使用 ansible 配置管理其他机器时,推荐要求机器间采用证书登录,实现无密码跳转。
证书登录步骤
- 生成证书:私钥和公钥,私钥存放在客户端,必要时为私钥加密;
- 服务器添加信用公钥:把生产的公钥,上传到 ssh 服务器,添加到指定的文件夹中;
- 配置开启允许证书登录,客户端就能通过私钥登录 ssh 服务器了。
实例配置
- 生成私钥和公钥
#rsa或者dsa加密算法,这里采用rsa
ssh-keygen -t rsa
#如果一路回车默认生成id_rsa和id_rsa.pub,前者是私钥,放在客户端,后者是公钥,需要放在ssh服务器
- 例如在客户端生成的公钥,需要将公钥拷贝到服务器上
#拷贝公钥到ssh服务器
# scp <本地私钥path> username@ip:<path>
# 还没配置完成,交互方式还是传统的用户名和密码吧
scp id_rsa.pub vagrant@10.45.47.54:~
scp lch_key.pub vagrant@10.45.47.55:~ && ssh vagrant@10.45.47.55 "cat ~/lch_key.pub >> ~/.ssh/authorized_keys"
- 服务端将公钥添加到 authorized_keys
#authorized_keys一般在~/.ssh/目录下,没有可以新建,也可以后面改sshd_config配置文件,指向其他路径
#追加公钥到文件末尾
cat id_rsa.pub >> ~/.ssh/authorized_keys
- 其他配置项,注意服务端配置的是 sshd_config, 客户端配置的是 ssh_config
- 服务端 sshd_config 配置
vi /etc/ssh/sshd_config
# 这里指定公钥的目录
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
- 客户端 ssh_config 配置
vi /etc/ssh/ssh_config
#添加私钥路径
#如果存在多个可以再次添加
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/rat_rsa
- 执行登录
#客户端如果没有配置私钥路径,可以在ssh后-i参数跟上私钥路径
#ssh user@ip 完成登录
ssh vagrant@10.45.47.54
- 其他注意
- ssh 登录时可以添加 - v 参数打印登录的详细信息;
- 服务端的
~/.ssh
下面只能自己有读写权限,其他用户和用户组不能有写权限,至少要 600,这个问题遇到过,配置了公钥和私钥,但是客户端就是不能登录,最后排查发现服务端的用户主目录曾被改过目录,但是用户的主目录有用户组的写权限导致客户端怎么都不能以证书方式登录,最后chmod g-w ~
搞定
文章2: SSH 证书登录教程
SSH 是服务器登录工具,提供密码登录和密钥登录。
但是,SSH 还有第三种登录方法,那就是证书登录。很多情况下,它是更合理、更安全的登录方法,本文就介绍这种登录方法。
一、非证书登录的缺点
密码登录和密钥登录,都有各自的缺点。 密码登录需要输入服务器密码,这非常麻烦,也不安全,存在被暴力破解的风险。 密钥登录需要服务器保存用户的公钥,也需要用户保存服务器公钥的指纹。这对于多用户、多服务器的大型机构很不方便,如果有员工离职,需要将他的公钥从每台服务器删除。
二、证书登录是什么?
证书登录就是为了解决上面的缺点而设计的。它引入了一个证书颁发机构(Certificate1 authority,简称 CA),对信任的服务器颁发服务器证书,对信任的用户颁发用户证书。登录时,用户和服务器不需要提前知道彼此的公钥,只需要交换各自的证书,验证是否可信即可。
证书登录的主要优点有两个:
- 用户和服务器不用交换公钥,这更容易管理,也具有更好的可扩展性。
- 证书可以设置到期时间,而公钥没有到期时间。针对不同的情况,可以设置有效期很短的证书,进一步提高安全性。
三、证书登录的流程
SSH 证书登录之前,如果还没有证书,需要生成证书。具体方法是:
-
(1)用户和服务器都将自己的公钥,发给 CA;
-
(2)CA 使用服务器公钥,生成服务器证书,发给服务器;
-
(3)CA 使用用户的公钥,生成用户证书,发给用户。
有了证书以后,用户就可以登录服务器了。整个过程都是 SSH 自动处理,用户无感知。
-
第一步,用户登录服务器时,SSH 自动将用户证书发给服务器。
-
第二步,服务器检查用户证书是否有效,以及是否由可信的 CA 颁发。
-
第三步,SSH 自动将服务器证书发给用户。
-
第四步,用户检查服务器证书是否有效,以及是否由信任的 CA 颁发。
-
第五步,双方建立连接,服务器允许用户登录。
四、生成 CA 的密钥
证书登录的前提是,必须有一个 CA,而 CA 本质上就是一对密钥,跟其他密钥没有不同,CA 就用这对密钥去签发证书。
虽然 CA 可以用同一对密码签发用户证书和服务器证书,但是出于安全性和灵活性,最好用不同的密钥分别签发。所以,CA 至少需要两对密钥:
- 一对是签发用户证书的密钥,假设叫做
user_ca
, - 另一对是签发服务器证书的密钥,假设叫做
host_ca
。
使用下面的命令,生成user_ca
:
# 生成 CA 签发用户证书的密钥
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user_ca -C user_ca
# 上面的命令会在`~/.ssh`目录生成一对密钥:`user_ca`(私钥)和`user_ca.pub`(公钥)。
# 这个命令的各个参数含义如下。
# `-t rsa`:指定密钥算法 RSA。
# `-b 4096`:指定密钥的位数是4096位。安全性要求不高的场合,这个值可以小一点,但是不应小于1024。
# `-f ~/.ssh/user_ca`:指定生成密钥的位置和文件名。
# `-C user_ca`:指定密钥的识别字符串,相当于注释,可以随意设置。
使用下面的命令,生成host_ca
:
# 生成 CA 签发服务器证书的密钥
$ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca
现在,~/.ssh
目录应该至少有四把密钥:
- user_ca私钥密钥:
~/.ssh/user_ca
- user_ca公钥密钥:
~/.ssh/user_ca.pub
- host_ca私钥密钥:
~/.ssh/host_ca
- host_ca公钥密钥:
~/.ssh/host_ca.pub
五、CA 签发服务器证书
有了 CA 以后,就可以签发服务器证书了。
- 签发证书,除了 CA 的密钥以外,还需要服务器的公钥。一般来说,SSH 服务器(通常是
sshd
)安装时,已经生成密钥/etc/ssh/ssh_host_rsa_key
了。如果没有的话,可以用下面的命令生成。
$ sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -b 4096 -t rsa
# 上面命令会在`/etc/ssh`目录,生成`ssh_host_rsa_key`(私钥)和`ssh_host_rsa_key.pub`(公钥)。
-
把服务器公钥
ssh_host_rsa_key.pub
,复制或上传到 CA 所在的服务器。 -
CA 就可以使用密钥
host_ca
为服务器的公钥ssh_host_rsa_key.pub
签发服务器证书:
$ ssh-keygen -s host_ca -I host.example.com -h -n host.example.com -V +52w ssh_host_rsa_key.pub
# 上面的命令会生成服务器证书`ssh_host_rsa_key-cert.pub`(服务器公钥名字加后缀`-cert`)。这个命令各个参数的含义如下。
# `-s`:指定 CA 签发证书的密钥。
# `-I`:身份字符串,可以随便设置,相当于注释,方便区分证书,将来可以使用这个字符串撤销证书。
# `-h`:指定该证书是服务器证书,而不是用户证书。
# `-n host.example.com`:指定服务器的域名,表示证书仅对该域名有效。如果有多个域名,则使用逗号分隔。用户登录该域名服务器时,SSH 通过证书的这个值,分辨应该使用哪张证书发给用户,用来证明服务器的可信性。
# `-V +52w`:指定证书的有效期,这里为52周(一年)。默认情况下,证书是永远有效的。建议使用该参数指定有效期,并且有效期最好短一点,最长不超过52周。
# `ssh_host_rsa_key.pub`:服务器公钥。
- 生成证书以后,可以使用下面的命令,查看证书的细节:
$ ssh-keygen -L -f ssh_host_rsa_key-cert.pub
- 为证书设置权限
$ chmod 600 ssh_host_rsa_key-cert.pub
六、CA 签发用户证书
下面,再用 CA 签发用户证书。这时需要用户的公钥,如果没有的话,客户端可以用下面的命令生成一对密钥。
$ ssh-keygen -f ~/.ssh/user_key -b 4096 -t rsa
上面命令会在~/.ssh
目录,生成user_key
(私钥)和user_key.pub
(公钥)。
然后,将用户公钥user_key.pub
,上传或复制到 CA 服务器。接下来,就可以使用 CA 的密钥user_ca
为用户公钥user_key.pub
签发用户证书。
$ ssh-keygen -s user_ca -I [user@example](mailto:user@example).com -n user -V +1d user_key.pub
上面的命令会生成用户证书user_key-cert.pub
(用户公钥名字加后缀-cert
)。这个命令各个参数的含义如下。
-s
:指定 CA 签发证书的密钥-I
:身份字符串,可以随便设置,相当于注释,方便区分证书,将来可以使用这个字符串撤销证书。-n user
:指定用户名,表示证书仅对该用户名有效。如果有多个用户名,使用逗号分隔。用户以该用户名登录服务器时,SSH 通过这个值,分辨应该使用哪张证书,证明自己的身份,发给服务器。-V +1d
:指定证书的有效期,这里为1天,强制用户每天都申请一次证书,提高安全性。默认情况下,证书是永远有效的。user_key.pub
:用户公钥。
生成证书以后,可以使用下面的命令,查看证书的细节。
$ ssh-keygen -L -f user_key-cert.pub
最后,为证书设置权限。
$ chmod 600 user_key-cert.pub
七、服务器安装证书
CA 生成服务器证书ssh_host_rsa_key-cert.pub
以后,需要将该证书发回服务器,可以使用下面的scp
命令,将证书拷贝过去。
$ scp ~/.ssh/ssh_host_rsa_key-cert.pub [root@host](mailto:root@host).example.com:/etc/ssh/
然后,将下面一行添加到服务器配置文件/etc/ssh/sshd_config
。
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
上面的代码告诉 sshd,服务器证书是哪一个文件。
重新启动 sshd。
$ sudo systemctl restart sshd
# 或者
$ sudo service sshd restart
八、服务器安装 CA 公钥
为了让服务器信任用户证书,必须将 CA 签发用户证书的公钥user_ca.pub
,拷贝到服务器。
$ scp ~/.ssh/user_ca.pub [root@host](mailto:root@host).example.com:/etc/ssh/
上面的命令,将 CA 签发用户证书的公钥user_ca.pub
,拷贝到 SSH 服务器的/etc/ssh
目录。
然后,将下面一行添加到服务器配置文件/etc/ssh/sshd_config
。
TrustedUserCAKeys /etc/ssh/user_ca.pub
上面的做法是将user_ca.pub
加到/etc/ssh/sshd_config
,这会产生全局效果,即服务器的所有账户都会信任user_ca
签发的所有用户证书。
另一种做法是将user_ca.pub
加到服务器某个账户的~/.ssh/authorized_keys
文件,只让该账户信任user_ca
签发的用户证书。具体方法是打开~/.ssh/authorized_keys
,追加一行,开头是@cert-authority principals="..."
,然后后面加上user_ca.pub
的内容,大概是下面这个样子。
@cert-authority principals="user" ssh-rsa AAAAB3Nz...XNRM1EX2gQ==
上面代码中,principals="user"
指定用户登录的服务器账户名,一般就是authorized_keys
文件所在的账户。
重新启动 sshd。
$ sudo systemctl restart sshd
# 或者
$ sudo service sshd restart
至此,SSH 服务器已配置为信任user_ca
签发的证书。
九、客户端安装证书
客户端安装用户证书很简单,就是从 CA 将用户证书user_key-cert.pub
复制到客户端,与用户的密钥user_key
保存在同一个目录即可。
十、客户端安装 CA 公钥
为了让客户端信任服务器证书,必须将 CA 签发服务器证书的公钥host_ca.pub
,加到客户端的/etc/ssh/ssh_known_hosts
文件(全局级别)或者~/.ssh/known_hosts
文件(用户级别)。
具体做法是打开ssh_known_hosts
或known_hosts
文件,追加一行,开头为@cert-authority *.example.com
,然后将host_ca.pub
文件的内容(即公钥)粘贴在后面,大概是下面这个样子。
@cert-authority *.example.com ssh-rsa AAAAB3Nz...XNRM1EX2gQ==
上面代码中,*.example.com
是域名的模式匹配,表示只要服务器符合该模式的域名,且签发服务器证书的 CA 匹配后面给出的公钥,就都可以信任。如果没有域名限制,这里可以写成*
。如果有多个域名模式,可以使用逗号分隔;如果服务器没有域名,可以用主机名(比如host1,host2,host3
)或者 IP 地址(比如11.12.13.14,21.22.23.24
)。
然后,就可以使用证书,登录远程服务器了。
$ ssh -i ~/.ssh/user_key [user@host](mailto:user@host).example.com
上面命令的-i
参数用来指定用户的密钥。如果证书与密钥在同一个目录,则连接服务器时将自动使用该证书。
十一、废除证书
废除证书的操作,分成用户证书的废除和服务器证书的废除两种。
服务器证书的废除,用户需要在known_hosts
文件里面,修改或删除对应的@cert-authority
命令的那一行。
用户证书的废除,需要在服务器新建一个/etc/ssh/revoked_keys
文件,然后在配置文件sshd_config
添加一行,内容如下。
RevokedKeys /etc/ssh/revoked_keys
revoked_keys
文件保存不再信任的用户公钥,由下面的命令生成。
$ ssh-keygen -kf /etc/ssh/revoked_keys -z 1 ~/.ssh/user1_key.pub
上面命令中,-z
参数用来指定用户公钥保存在revoked_keys
文件的哪一行,这个例子是保存在第1行。
如果以后需要废除其他的用户公钥,可以用下面的命令保存在第2行。
$ ssh-keygen -ukf /etc/ssh/revoked_keys -z 2 ~/.ssh/user2_key.pub
十二、参考链接
- SSH Emergency Access, Carl Tashian
- Using OpenSSH Certificate Authentication, Red Hat Enterprise Linux Deployment Guide
- How to SSH Properly, Gus Luxton
(完)