# Copyright (C) 2021-2024 Thien Tran
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

variant: fcos
version: 1.5.0
passwd:
  users:
    - name: tomster
      ssh_authorized_keys:
        - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINkTKkJS7Id1WCyA5Klu/moLG9mP5hTC+v2qYqypMF1u contact@tommytran.io
      groups:
        - wheel
        - sudo
    - name: unpriv
systemd:
  units:
    - name: postinst.service
      enabled: true
      contents: |
        [Unit]
        Description=Initial System Setup
        # We run after `systemd-machine-id-commit.service` to ensure that
        # `ConditionFirstBoot=true` services won't rerun on the next boot.
        After=systemd-machine-id-commit.service
        After=network-online.target
        # We run before `zincati.service` to avoid conflicting rpm-ostree
        # transactions.
        Before=zincati.service
        ConditionPathExists=!/var/lib/%N.stamp

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/sbin/restorecon -R /var
        ExecStart=/usr/sbin/setsebool -P container_use_cephfs off
        ExecStart=/usr/sbin/setsebool -P virt_use_nfs off
        ExecStart=/usr/sbin/setsebool -P virt_use_samba off
        ExecStart=/usr/bin/rpm-ostree override remove cifs-utils containerd docker-cli dnsmasq google-compute-engine-guest-configs-udev iptables-legacy iptables-legacy-libs moby-engine runc samba-client-libs samba-common libwbclient libsmbclient samba-common-libs sssd-client sssd-ldap sssd-common sssd-krb5-common sssd-nfs-idmap sssd-ad sssd-krb5 sssd-ipa sssd-common-pac
        ExecStart=/usr/bin/rpm-ostree install docker-ce docker-compose-plugin firewalld hardened_malloc qemu-guest-agent tuned
        ExecStart=/usr/bin/sed -i 's/\s+nullok//g' /etc/pam.d/system-auth
        ExecStart=/usr/bin/touch /var/lib/%N.stamp
        ExecStart=/usr/bin/systemctl --no-block reboot

        [Install]
        WantedBy=multi-user.target
    - name: postinst2.service
      enabled: true
      contents: |
        [Unit]
        Description=Initial System Setup Part 2
        # We run this after the packages have been overlayed
        After=network-online.target
        ConditionPathExists=!/var/lib/%N.stamp
        ConditionPathExists=/var/lib/postinst.stamp

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/echo 'libhardened_malloc.so' > /etc/ld.so.preload
        ExecStart=/usr/bin/systemctl enable --now firewalld
        ExecStart=/usr/bin/firewall-cmd --lockdown-on
        ExecStart=/usr/bin/firewall-cmd --permanent --remove-service=mds
        ExecStart=/usr/bin/touch /var/lib/%N.stamp
        ExecStart=/usr/bin/systemctl --no-block reboot

        [Install]
        WantedBy=multi-user.target
    - name: gvisor-updater.service
      enabled: true
      contents: |
        [Unit]
        Description=Update gVisor
        Requires=network-online.target
        After=network-online.target
        Before=docker.service

        [Service]
        Type=oneshot
        RuntimeDirectory=gvisor-updater
        WorkingDirectory=/run/gvisor-updater
        
        ExecStart=/usr/bin/sleep 5
        ExecStart=curl -sS --remote-name-all 'https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/runsc' 'https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/runsc.sha512' 'https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/containerd-shim-runsc-v1' 'https://storage.googleapis.com/gvisor/releases/release/latest/x86_64/containerd-shim-runsc-v1.sha512'
        ExecStart=sha512sum -c runsc.sha512 -c containerd-shim-runsc-v1.sha512
        ExecStart=+chown root:root runsc containerd-shim-runsc-v1
        ExecStart=+chmod a+rx runsc containerd-shim-runsc-v1
        ExecStart=+mv -Z runsc containerd-shim-runsc-v1 /usr/local/bin/

        DynamicUser=true
        CapabilityBoundingSet=
        LockPersonality=true
        MemoryDenyWriteExecute=true
        NoNewPrivileges=true
        PrivateDevices=true
        PrivateIPC=true
        PrivateTmp=true
        ProcSubset=pid
        ProtectClock=true
        ProtectControlGroups=true
        ProtectHome=true
        ProtectHostname=true
        ProtectKernelLogs=true
        ProtectKernelModules=true
        ProtectKernelTunables=true
        ProtectProc=invisible
        ProtectSystem=strict
        RestrictAddressFamilies=
        RestrictNamespaces=true
        RestrictRealtime=true
        RestrictSUIDSGID=true
        RuntimeDirectoryMode=700
        SystemCallArchitectures=native
        SystemCallFilter=@system-service
        SystemCallFilter=~@obsolete

        [Install]
        WantedBy=multi-user.target
    - name: docker-compose-updater@.service
      enabled: false
      contents: |
        [Unit]
        Description=Docker Compose Updater for /srv/%I
        Requires=network-online.target
        Requisite=docker.service
        After=network-online.target
        After=docker.service

        [Service]
        Type=oneshot
        User=root
        Group=root
        WorkingDirectory=/srv/%i
        ExecStart=/usr/bin/docker image prune -f -a --filter 'until=240h'
        #ExecStart=/usr/bin/git pull
        ExecStart=/usr/bin/docker compose pull
        ExecStart=/usr/bin/docker compose up -d
    - name: docker-compose-updater@.timer
      enabled: false
      contents: |
        [Unit]
        Description=Run docker-compose-updater for /srv/%I once a week, 15 mintues after OS updates

        [Timer]
        OnCalendar=Fri 2:15
        Persistent=true

        [Install]
        WantedBy=timers.target
    - name: docker.service
      enabled: true
    - name: fstrim.timer
      enabled: true
    - name: systemd-oomd.service
      enabled: true
    - name: rpm-ostree-countme.timer
      enabled: false
      mask: true
    - name: sshd.service
      enabled: false
    - name: sshd.socket
      enabled: true
    - name: kdump.service
      enabled: false
      mask: true
    - name: debug-shell.service
      enabled: false
      mask: true
storage:
  files:
    - path: /etc/zincati/config.d/51-rollout-wariness.toml
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/zincati/config.d/51-rollout-wariness.toml
    - path: /etc/zincati/config.d/55-updates-strategy.toml
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/zincati/config.d/55-updates-strategy.toml
    - path: /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:secureblue:hardened_malloc.repo
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/yum.repos.d/_copr:copr.fedorainfracloud.org:secureblue:hardened_malloc.repo
    - path: /etc/yum.repos.d/docker-ce.repo
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/yum.repos.d/docker-ce.repo
    - path: /etc/docker/daemon.json
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/docker/daemon.json
    - path: /etc/chrony.conf
      contents:
        source: https://raw.githubusercontent.com/GrapheneOS/infrastructure/refs/heads/main/etc/chrony.conf
      overwrite: true
    - path: /etc/modprobe.d/server-blacklist.conf
      contents:
        source: https://raw.githubusercontent.com/secureblue/secureblue/live/files/system/usr/etc/modprobe.d/blacklist.conf
    - path: /etc/sysctl.d/99-server.conf
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/sysctl.d/99-server.conf
    - path: /etc/systemd/system/NetworkManager.service.d/99-brace.conf
      contents:
        source: https://gitlab.com/divested/brace/-/raw/master/brace/usr/lib/systemd/system/NetworkManager.service.d/99-brace.conf
    - path: /etc/systemd/system/irqbalance.service.d/99-brace.conf
      contents:
        source: https://gitlab.com/divested/brace/-/raw/master/brace/usr/lib/systemd/system/irqbalance.service.d/99-brace.conf
    - path: /etc/ssh/sshd_config.d/10-custom.conf
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/ssh/sshd_config.d/10-custom.conf
    - path: /etc/ssh/ssh_config.d/10-custom.conf
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/ssh/ssh_config.d/10-custom.conf
    - path: /etc/systemd/system/sshd.service.d/override.conf
      contents:
        source: https://raw.githubusercontent.com/GrapheneOS/infrastructure/refs/heads/main/etc/systemd/system/sshd.service.d/override.conf
    - path: /etc/tuned/active_profile
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/tuned/active_profile
    - path: /etc/tuned/profile_mode
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Fedora-CoreOS-Ignition/main/etc/tuned/profile_mode
    - path: /etc/systemd/zram-generator.conf
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/systemd/zram-generator.conf
    - path: /etc/security/limits.d/30-disable-coredump.conf
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/security/limits.d/30-disable-coredump.conf
    - path: /etc/systemd/coredump.conf.d
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/systemd/coredump.conf.d/disable.conf
    - path: /etc/sysconfig/chronyd
      overwrite: true
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/sysconfig/chronyd
    - path: /etc/issue
      overwrite: true
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/issue
    - path: /etc/issue.net
      overwrite: true
      contents:
        source: https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/issue
  links:
    - path: /etc/localtime
      target: ../usr/share/zoneinfo/Etc/UTC
    - path: /etc/systemd/system/multi-user.target.wants/tuned.service
      target: /usr/lib/systemd/system/tuned.service
kernel_arguments:
  should_exist:
    - mitigations=auto,nosmt
    - spectre_v2=on
    - spectre_bhi=on
    - spec_store_bypass_disable=on
    - tsx=off
    - kvm.nx_huge_pages=force
    - nosmt=force
    - l1d_flush=on
    - l1tf=full,force 
    - kvm-intel.vmentry_l1d_flush=always
    - spec_rstack_overflow=safe-ret
    - gather_data_sampling=force 
    - reg_file_data_sampling=on
    - random.trust_bootloader=off
    - random.trust_cpu=off
    - intel_iommu=on
    - amd_iommu=force_isolation
    - efi=disable_early_pci_dma
    - iommu=force
    - iommu.passthrough=0
    - iommu.strict=1
    - slab_nomerge
    - init_on_alloc=1
    - init_on_free=1
    - pti=on
    - vsyscall=none
    - ia32_emulation=0
    - page_alloc.shuffle=1
    - randomize_kstack_offset=on
    - debugfs=off
    - lockdown=confidentiality
    - module.sig_enforce=1
    - console=tty0
    - console=ttyS0,115200