如何使用Ansible配置免密证书登录?

1. 安装OpenSSL并生成密钥对

在要配置免密登录的客户端和服务器上都需要安装OpenSSL工具。如果系统没有安装OpenSSL,可以使用以下命令进行安装:

sudo apt update
sudo apt install openssl

接下来,在客户端上生成密钥对。打开终端并执行以下命令:

openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -in client.csr -signkey client.key -out client.crt

这几条命令的作用分别是:

如何使用Ansible配置免密证书登录?

1. 生成2048位的RSA私钥。

2. 生成证书签名请求(CSR),需要填写一些信息,如国家、省份、城市、组织名称等。

3. 使用私钥生成自签名的证书,有效期设置为365天。

生成的文件有client.key(私钥)、client.csr(证书签名请求)和client.crt(证书)。将client.crt文件复制到服务器的authorized_keys目录下。

2. 配置SSH使用证书登录

在服务器上,编辑SSH配置文件:

sudo nano /etc/ssh/sshd_config

找到以下配置项并修改:

1. 将`PubkeyAuthentication`设置为`yes`,允许公钥认证。

2. 将`AuthorizedKeysFile`设置为`.ssh/authorized_keys`,指定存放公钥的文件。

3. 将`PasswordAuthentication`设置为`no`,禁止密码认证。

修改后的配置如下:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no

保存并退出编辑器,然后重启SSH服务:

sudo systemctl restart sshd

3. 在客户端配置SSH使用证书

在客户端上,编辑SSH配置文件:

nano ~/.ssh/config

添加以下配置,指定使用证书登录服务器:

Host server
    HostName your_server_ip
    User your_username
    IdentityFile /path/to/client.key
    CertificateFile /path/to/client.crt
    IdentitiesOnly yes

其中:

1. `Host`是自定义的别名,可以是任何名称。

2. `HostName`是服务器的IP地址或域名。

3. `User`是登录服务器的用户名。

4. `IdentityFile`是客户端的私钥文件路径。

5. `CertificateFile`是客户端的证书文件路径。

6. `IdentitiesOnly`设置为`yes`,表示只使用指定的私钥。

保存并退出编辑器,然后测试连接:

ssh -v server

如果配置正确,应该可以直接登录服务器,无需输入密码。

4. 常见问题及解决方案

在配置过程中,可能会遇到一些问题,以下是常见的几个问题及解决方案:

4.1 连接失败提示“Permission denied (publickey)”

原因:可能是私钥文件权限设置错误或SSH服务配置不正确。

解决方案:

1. 检查私钥文件权限,确保只有用户本人可以读写:

chmod 600 /path/to/client.key

2. 确认SSH配置文件中的`PubkeyAuthentication`和`AuthorizedKeysFile`设置正确。

4.2 无法使用证书登录

原因:可能是证书文件不完整或格式错误。

解决方案:

1. 确认证书文件(.crt)和私钥文件(.key)都在指定路径下。

2. 可以尝试重新生成证书和私钥。

4.3 SSH版本问题

原因:某些旧的SSH版本可能不支持证书登录。

解决方案:

1. 更新SSH服务到最新版本:

sudo apt update
sudo apt install openssh-server

5. 如何验证证书登录是否成功?

验证证书登录是否成功非常简单。在客户端执行以下命令:

ssh -v server

如果登录成功,终端应该会直接进入服务器,无需输入密码。如果出现以下提示,表示登录成功:

Welcome to Ubuntu 20.04.3 LTS (GNU/Linux server 5.4.0-109-generic x86_64)
...
Last login: Mon Oct 16 10:30:45 2023 from your_client_ip
ubuntu@server:~$

如果登录失败,会提示密码错误或其他认证错误,需要根据错误提示进行排查。

6. 如何批量配置多台服务器?

如果需要批量配置多台服务器,可以使用Ansible进行自动化部署。以下是一个简单的Ansible playbook示例:

---
- name: 配置免密登录证书
  hosts: all
  become: yes
  tasks:
    - name: 安装OpenSSL
      apt:
        name: openssl
        state: present

    - name: 生成密钥对
      command: |
        openssl genrsa -out /home/{{ ansible_user }}/.ssh/client.key 2048 &&
        openssl req -new -key /home/{{ ansible_user }}/.ssh/client.key -out /home/{{ ansible_user }}/.ssh/client.csr &&
        openssl x509 -req -days 365 -in /home/{{ ansible_user }}/.ssh/client.csr -signkey /home/{{ ansible_user }}/.ssh/client.key -out /home/{{ ansible_user }}/.ssh/client.crt

    - name: 配置SSH
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^PubkeyAuthentication'
        line: 'PubkeyAuthentication yes'
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^AuthorizedKeysFile'
        line: 'AuthorizedKeysFile .ssh/authorized_keys'
      lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^PasswordAuthentication'
        line: 'PasswordAuthentication no'
      service:
        name: sshd
        state: restarted

这个playbook会:

1. 在所有目标服务器上安装OpenSSL。

2. 生成密钥对并保存到/home/用户名/.ssh目录下。

3. 修改SSH配置文件并重启SSH服务。

使用前,需要先创建inventory文件,列出所有目标服务器:

[servers]
server1 ansible_user=ubuntu
server2 ansible_user=debian
server3 ansible_user=centos

然后执行以下命令运行playbook:

ansible-playbook -i inventory playbook.yml

7. 有什么安全注意事项?

使用证书登录虽然方便,但也需要注意以下安全事项:

1. 私钥文件(.key)必须保持安全,不要设置错误的权限,确保只有所有者可以读写。

2. 不要将私钥文件添加到版本控制系统中,如Git。

3. 定期更换证书,避免证书过期导致无法登录。

4. 如果证书是自签名的,可以在客户端手动信任证书,避免每次连接都提示证书错误:

ssh-keyscan server_ip >> ~/.ssh/known_hosts

5. 确保SSH服务只监听内网或信任的网络,避免被外部攻击。