summaryrefslogblamecommitdiff
blob: 23de53cb600cbe578e6dbf776a0f9f77a68bfb62 (plain) (tree)












































































































































































































































































































                                                                                                                       
---
# You can manually view how your OS-provided packages are supported with:
# ubuntu-support-status --show-all
- name: update packages
  apt:
    update_cache: yes
    upgrade: safe
    cache_valid_time: 3600


- name: fix inputrc
  copy:
    src: inputrc
    dest: /etc/inputrc
    owner: root
    group: root
    mode: 0644

- name: fix vimrc
  copy:
    src: vimrc.local
    dest: /etc/vim/
    owner: root
    group: root
    mode: 0644


- include_role:
    name: ramdisk


- name: remove ubuntu call home reporting cron
  cron:
    cron_file: popularity-contest
    state: absent


- name: remove low port restriction
  sysctl:
    name: net.ipv4.ip_unprivileged_port_start
    value: 0
    state: present
    sysctl_set: yes


# 3 means enable for outgoing and incoming connections
# 2 means enable for incoming connections
# 1 means enable for outgoing connections
# 0 means disabled
# Linux 3.13 (2014-01-19) and newer
- name: enable server and client TCP_FASTOPEN
  sysctl:
    name: net.ipv4.tcp_fastopen
    value: 3
    state: present
    sysctl_set: yes


# These were taken from:
# https://wiki.mozilla.org/Security/Server_Side_TLS#Pre-defined_DHE_groups
- name: populate known-good dhparams
  copy:
    src: "{{ item }}"
    dest: "/etc/ssl/{{ item }}"
  loop:
    - ffdhe2048.pem
    - ffdhe3072.pem
    - ffdhe4096.pem


- name: configure /etc/hostname
  hostname:
    name: "{{ inventory_hostname }}"

    #- name: Add IP address of all hosts to all hosts
    #  lineinfile:
    #    state: present
    #    dest: /etc/hosts
    #    regexp: '.*{{ item }}$'
    #    line: "{{ hostvars[item].ansible_default_ipv4.address }} {{item}}"
    #  when: hostvars[item].ansible_default_ipv4.address is defined
    #  with_items: "{{ groups['all'] }}"


- name: configure sshd to only listen on IPv4
  lineinfile:
    dest: /etc/ssh/sshd_config
    regexp: '^#?AddressFamily'
    line: "AddressFamily inet" # no ipv6
    state: present
  notify: reload sshd


  # Capture example:
  #- replace:
  #    path: /etc/hosts
  #    regexp: '(\s+)old\.host\.name(\s+.*)?$'
  #    replace: '\1new.host.name\2'
  #    backup: yes


- name: fix motd
  replace:
    path: /etc/default/motd-news
    regexp: 'https://motd.ubuntu.com'
    replace: 'https://matt.sh/motd'
  notify:
    - clear motd cache


# Verify against:
# systemctl list-timers
- name: disable more automated call home reporting
  systemd:
    name: "{{ item }}"
    state: stopped
    enabled: False
  loop:
    - apt-daily-upgrade.timer
    - apt-daily.timer
    - motd-news.timer


- name: remove ubuntu self-advertising
  file:
    path: "/etc/update-motd.d/{{ item }}"
    state: absent
  loop:
    - 91-release-upgrade
    - 80-livepatch
    - 10-help-text
  notify:
    - clear motd cache


# Ubuntu's pam_motd.so shows you /etc/legal
# on login if you don't have ~/.cache/motd.legal-displayed
# There is no way to disable the creation of that file in ~/.cache on login,
# but we can wipe out the message for new users.
- name: remove login disclaimer
  file:
    path: /etc/legal
    state: absent


- name: place net-listeners.py
  copy:
    src: net-listeners.py
    dest: /usr/local/bin/
    owner: root
    group: root
    mode: 0755

- name: place scp/rsync-only ssh restriction capability
  copy:
    src: ssh-transfer-only.sh
    dest: /usr/local/bin/
    owner: root
    group: root
    mode: 0755

# can't setsid 04755 scripts, so enable script with global passwordless sudo
- name: enable all user running of net-listeners.py
  lineinfile:
    path: /etc/sudoers.d/net-listeners
    regexp: "listeners.py"
    line: "ALL ALL = (root) NOPASSWD: /usr/local/bin/net-listeners.py"
    create: yes
    mode: 0440

- name: add uptime and uname to login motd
  lineinfile:
    dest: /etc/update-motd.d/00-header
    line: "{{ item }}"
    state: present
  loop:
    - printf "\n$(w -us)\n"

- name: add listening watcher to global login config
  lineinfile:
    dest: /etc/bash.bashrc
    line: "{{ item }}"
    state: present
  loop:
    # Only show output when running a login, not when starting a sudo shell
    - "[[ -z $SUDO_UID ]] && sudo /usr/local/bin/net-listeners.py"

- name: ensure system grub template has serial access
  lineinfile:
    dest: /etc/default/grub
    regexp: '^GRUB_CMDLINE_LINUX='
    line: 'GRUB_CMDLINE_LINUX="console=ttyS0 {{ grub.extras }}"'
    state: present
  notify: reload grub


# This is an ops opinion. For more advanced needs, modify here or just template
# the entire sshd_config directly.
- name: configure sshd to only listen on local IP
  lineinfile:
    dest: /etc/ssh/sshd_config
    regexp: '^#?ListenAddress'
    line: "ListenAddress {{ hostvars[inventory_hostname]['ansible_' + network.interface.private]['ipv4']['address'] }}"
    state: present
  notify: reload sshd


- name: install system tools
  apt:
    pkg:
      # acl is required for ansible to "become_user" as someone non-root because
      # of permissions on its temporary files. Ansible will setfacl on temp files
      # so it doesn't have to 0666 everything just so a new user can modify things.
      - acl

      # you aren't a linux server without sending nightly summary emails
      - logwatch

      # apt helpers for repo installs not included by default for some reason
      - software-properties-common

      # production CA bundles so we don't get unknown CA errors
      - ca-certificates

      # Maintains high numbers in /proc/sys/kernel/random/entropy_avail
      - rng-tools

      # should we use a more modern thing than collect? distributed osquery?
      - collectd

      # make sure 'install_recommends: no' or this installs lots of other stuff
      - vim-nox

      # rrdtool only installed so we can be lazy and generate graphs on-demand
      # with: /usr/share/doc/collectd-core/examples/collectd2html.pl
      # TODO: enable centralized reporting system
      - rrdtool

      # netstat, mii-tool, etc
      - net-tools
    install_recommends: no
    state: latest

# use a modern ntp client+server.
#
# systemd actually has a built-in ntp client called 'systemd-timesyncd'
# You can view its status with:
# journalctl -u systemd-timesyncd
# timedatectl
#
# Installing chrony will disable systemd-timesyncd
# (represented in apt with "Replaces: time-daemon")
# but it doesn't _actually_ disable it according to timedatectl (bug?)
# so we also manually run 'timedatectl set-ntp false' just to confirm.
# A good writeup about systemd-timesyncd lives at:
# https://wiki.archlinux.org/index.php/systemd-timesyncd
#
# You can view your live chrony status with:
# chronyc tracking
# chronyc sources
# chronyc sourcestats
#
# ...and that's a lot more detail than the built-in garabage systemd-timesyncd
# client will tell you about how your system time is being managed.
#
# chrony is both an ntp client with a remote administration interface
# and an ntp server, but by default chrony does not enable remote admin
# or ntp serving without additional explicit configuration (chrony.conf).
#
# For more details about becoming an ntp server and remote time administartion,
# see sections 2.2 and 2.5 of:
# https://chrony.tuxfamily.org/faq.html#_how_do_i_make_an_ntp_server_from_an_ntp_client
- name: install ntp client
  apt:
    pkg: chrony
    state: latest
  notify:
    - double disable systemd ntp client

# If ansible facts aren't enough, we can get puppet and chef facts too:
#- name: install facter
#  apt:
#    pkg: facter
#    state: latest
#
#- name: install ohai
#  apt:
#    pkg: facter
#    state: latest


# cleanup
- name: cleanup packaging
  apt:
    autoclean: yes
    autoremove: yes

# If needed, build and provide:
#
# Build for nsjail:
# apt install protobu* bison flex pkg-config libprotobuf-dev
Powered by cgit v1.2.3 (git 2.41.0)