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

问题描述 投票:3回答:3

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

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

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

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

这里有几个问题:

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

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

ssh ansible ansible-playbook
3个回答
2
投票

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

- hosts: all
  vars:
    ansible_user: root
  become: "{{ ansible_user != 'root' }}"

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


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用户执行的其他操作( remote_user = ansible ansible.cfg中的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永远不会直接从具体的playbook中调用。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.