使用Ansible锁定SSH的最佳做法是什么?

时间:2016-08-26 22:50:39

标签: ssh ansible ansible-playbook

说我有一台服务器,我想做以下事情:

  • 将SSH端口更改为33333
  • 禁用root登录
  • 禁用密码登录,仅允许基于密钥的身份验证

我对执行这些任务的说明不感兴趣。网上有很多东西。

我的问题是关于最佳做法。

以下是一些问题:

  • 当我使用playbook更改默认SSH端口时,我无法在同一主机上再次运行相同的Playbook。这是因为我需要在playbook运行一次之后更改库存文件中的SSH端口参数。
  • 与上面类似,我使用root登录系统,一旦root登录被禁用,我需要更改' remote_user'参数某处。
  • 通过密码禁用登录会导致与上述类似的问题。

如果我的方法存在一些基本问题,我也会感激。

3 个答案:

答案 0 :(得分:2)

就像@mwp一样,我有一个playbook来启动ansible。它创建特殊用户(名为'ansible)以连接到服务器,将它们添加到sudoers。这本剧本尽可能少。

---
# This playbook for prepare server for ansible.

- name: add role ansible_init
  hosts: '{{ target }}'
  remote_user: root
  roles:
    - ansible_init

角色'ansible_init'是:

---

- name: install ansible client library
  yum: name={{ item }} state=latest
  with_items:
    - libselinux-python
    - policycoreutils-python

- name: useradd ansible
  user:
    name={{ ansible_init.ansible_user.login }}
    password={{ ansible_init.ansible_user.password }}

- name: add default ssh key for ansible user
  authorized_key:
    user={{ ansible_init.ansible_user.login }}
    key="{{ lookup('file', '{{ ansible_init.ansible_user.ssh_key_file }}') }}"
    state=present

- name: nopasswd sudo for ansible user
  lineinfile: "dest=/etc/sudoers state=present regexp='^{{ ansible_init.ansible_user.login }}' line='{{ ansible_init.ansible_user.login }} ALL=(ALL) NOPASSWD: ALL'"

作为ansible用户执行的其他操作(ansible.cfg中为remote_user = ansible)。

设置服务器(邮件,数据库,网络等)的数字剧本包括必要的角色,在常见的剧本中分开的常见步骤(包括作为第一步)。常见的playbook设置了sshd,firewalld,fail2ban,安装了额外的repos,服务器的known_hosts等。

典型的剧本看起来像:

# This playbook deploys 'webserver' server.

- include: init_server.yml

- name: deploy 'webserver'
  hosts: '{{ target | default("webservers") }}'
  become: true
  become_user: root
  roles:
    - git
    - nginx
...........

init_server.yml永远不会直接从具体的剧本中调用。

答案 1 :(得分:1)

我维持" bootstrap" playbook,与我的其他playbooks和角色分开,完成安装python 2.x和python-apt(使用local_action和ssh),创建用户和授予sudo访问权限,锁定root和SSH等的初始工作。如果我需要为了引导新的主机,我运行了限制(-l--limit)选项的playbook。如果我需要修改现有主机,例如添加新用户,我运行playbook并传入额外的变量(-e--extra-vars)来覆盖SSH用户名和端口。根据变量定义,我的任务被参数化,使得它们使用sudo(或不使用)或变为(或不变),例如:

become: "{{ 'no' if ansible_ssh_user == 'root' else 'yes' }}"

如果您有其他问题,请告诉我,我会尽力扩展此答案!

答案 2 :(得分:0)

一种方法是在启动之前尽可能多地处理此问题。也就是说,修改您正在启动的图像,以便它已经进行了必要的更改。亚马逊将建立一个定制的AMI;与其他供应方法相比,它将有不同的技术,但原则是相同的。