Visitors have accessed this post 11792 times.

Устанавливаем дистрибутив NixOS

9
2
11792
21 августа 2020 13:23
Автор: Rebrain Me
Linux

Visitors have accessed this post 11792 times.

Автор — Юрий Изоркин

Краткая справка из Wikipedia

NixOS — дистрибутив Linux, созданный поверх менеджера пакетов Nix. Он использует декларативную конфигурацию и позволяет надежно обновлять систему. Предлагаются два основных направления: текущий стабильный выпуск и Unstable после последней разработки. 

Любая ОС Linux после установки требует базовой настройки — установки необходимых приложений, настройки базовых служб и безопасности. Обычно для таких целей я создаю текстовый файл и в него копирую базовые команды по настройке ОС и конфигурационные файлы. У каждой версии дистрибутива Linux базовая настройка системы может отличаться.

Несколько лет назад я наткнулся на дистрибутив для Linux  под названием NixOS — с декларативным описанием конфигурации системы и функциональным менеджером пакетов nix. Вся конфигурация NixOS описывается в конфигурационном файле /etc/nixos/configuration.nix, в котором указываются настройки системы, устанавливаемые пакеты и сервисы. На основе этого файла командой nixos-rebuild создается конфигурация системы.

В этом туториале хочу рассказать и показать на примерах, как установить NixOS и сделать первоначальную настройку системы. Конфигурацию я сделал заранее, поэтому нам остается только скопировать ее в нашу систему и активировать. За что отвечает каждый файл конфигурации — смотрите чуть ниже.

Что будем делать?

Будем ставить NixOS на виртуальную машину. Так как  я использую нестабильную ветку, то ее и будем ставить.

Установка NixOS

Скачиваем загрузочный ISO образ nixos-minimal с этой страницы https://nixos.org/channels/nixos-unstable и запускаем его.

Дополнительную информацию по установке можно взять отсюда https://nixos.org/nixos/manual/index.html#sec-installation.

Для удобства работы запустим openssh сервис:

sudo systemctl start sshd

И зададим пароль для пользователя nixos:

passwd nixos

Смотрим текущий IP-адрес виртуальной машины и подключаемся по этому адресу по ssh под пользователем nixos.

ip addr show

После подключения к системе проверяем, какие диски у нас подключены:

lsblk
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0   7:0    0 505.7M  1 loop /nix/.ro-store
sr0    11:0    1   552M  0 rom  /iso
vda   253:0    0    20G  0 disk

Создаем разделы на диске vda (в зависимости от типа виртуальной машины диски могут отличаться) и монтируем их:

sudo parted /dev/vda -- mklabel msdos
sudo parted /dev/vda -- mkpart primary linux-swap 1MiB 4GiB
sudo parted /dev/vda -- mkpart primary 4GiB 100%
sudo mkswap -L swap /dev/vda1
sudo mkfs.ext3 -L NixOS /dev/vda2
sudo swapon /dev/vda1
sudo mount /dev/vda2 /mnt

Генерируем первоначальную конфигурацию системы:

sudo nixos-generate-config --root /mnt

После выполнения команды создаются 2 файла:

  • /mnt/etc/nixos/configuration.nix
  • /mnt/etc/nixos/hardware-configuration.nix

Приведем файл конфигурации /mnt/etc/nixos/configuration.nix к такому виду:

sudo nano /mnt/etc/nixos/configuration.nix
{ config, pkgs, ... }:
{
imports = [
./hardware-configuration.nix
];
boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
boot.loader.grub.device = "/dev/vda";
networking.hostName = "NixOS-example";
environment.systemPackages = with pkgs; [
wget vim mkpasswd
];
services.openssh.enable = true;
users.users.rebrain = {
isNormalUser = true;
uid = 51011;
group = "rebrain";
extraGroups = [ "wheel" "users" ];
};
users.groups.rebrain = {
gid = 51011;
};
system.stateVersion = "20.09";
}

И запустим установку системы:

sudo nixos-install --no-root-passwd --root /mnt

Внимание: указывая параметр —no-root-passwd, мы запрещаем вход в систему пользователю root.

После установки системы установим пароль для нашего пользователя rebrain, чтобы после перезагрузки системы мы смогли подключиться удаленно по ssh:

sudo nixos-enter --root /mnt -c 'passwd rebrain'
Размонтируем разделы и выключаем виртуальную машину:
sudo umount /mnt
sudo swapoff /dev/vda1
sudo shutdown -h now

Первоначальная установка завершена, переходим к базовой настройке.

Настройка NixOS

В настройках виртуальной машины отключаем ISO образ и загружаем в установленную систему. Заходим по SSH с аутентификацией по паролю, скачиваем и распаковываем архив с конфигурацией в директорию /etc/nixos.

cd /tmp
wget https://git.elven.pw/Rebrain/basic-nixos/archive/master.tar.gz -O basic-nixos-config.tar.gz
tar xzf basic-nixos-config.tar.gz
sudo cp -r /tmp/basic-nixos/nix-config /etc/nixos

У нас получается такая структура конфигурации:

  • основные настройки системы хранятся в директории /etc/nixos/nix-config/generic;
  • индивидуальные настройки текущего сервера — в директории /etc/nixos/nix-config/servers/example.

Приводим конфигурацию /etc/nixos/configuration.nix к такому виду:

sudo nano /etc/nixos/configuration.nix
{ config, pkgs, ... }:
{
imports = [
./hardware-configuration.nix
./nix-config/servers/example/configuration.nix
];
system.stateVersion = "20.09";
}

Генерируем хеш пароля для пользователя rebrain командой:

mkpasswd -m sha-512

И вставляем результат в /etc/nixos/nix-config/servers/example/users.nix в hashedPassword, где _generated_hash_pass_ заменяем на наш хеш. В итоге конфигурация будет выглядеть так:

sudo nano /etc/nixos/nix-config/servers/example/users.nix
{ config, ... }:
let
ssh-keys = import ./../../generic/security/ssh-keys.nix;
in {
users = with ssh-keys; {
users.root = {
hashedPassword = null;
};
users.rebrain = {
isNormalUser = true;
uid = config.uid-gid.rebrain;
group = "rebrain";
extraGroups = [ "wheel" "users" ];
openssh.authorizedKeys.keys = [
work.rebrain_example
];
hashedPassword = "_generated_hash_pass_";
};
groups.rebrain = {
gid = config.uid-gid.rebrain;
};
groups.ssh-users = {
members = [ "rebrain" ];
};
};
}

Чтобы авторизоваться на сервере по ключу, прописываем в файл generic/security/ssh-keys.nix публичный ключ:

sudo nano /etc/nixos/nix-config/generic/security/ssh-keys.nix
{
work = {
rebrain_example = "_ssh_public_key_example";
};
}

Ссылка на ключ work.rebrain_example уже прописана в файле servers/example/users.nix:

...
users.rebrain = {
...
openssh.authorizedKeys.keys = [
work.rebrain_example
];
...

Внимание! Параметр users.root = { hashedPassword = null; }; запрещает вход в систему  пользователю root.

Если необходимо управлять текущей системой c помощью утилиты nixops, добавляем ssh ключ root пользователю:

sudo nano /etc/nixos/nix-config/generic/security/ssh-keys.nix
{
work = {
...
root_example = "_ssh_public_key_example";
};
}
sudo nano /etc/nixos/nix-config/servers/example/users.nix
...
users.root = {
hashedPassword = null;
openssh.authorizedKeys.keys = [
work.root_example
];
};
...

Если в системе вместо vda диска используется sda, то в файле /etc/nixos/nix-config/servers/example/configuration.nix меняем /dev/vda на /dev/sda:

sudo nano /etc/nixos/nix-config/servers/example/configuration.nix
...
boot = {
loader.grub.device = "/dev/sda";
...

Обновляем конфигурацию системы и перезагружаемся:

sudo nixos-rebuild boot
sudo shutdown -r now

При первом входе zsh предлагает сконфигурировать файл ~/.zshrc,так как у нас уже готова для него конфигурация (в файле generic/shell.nix), то пропускаем конфигурацию и создаем пустой файл — вводим 0.

Создадим для нашей конфигурации git-репозиторий:

sudo git config --global user.email "rebrain@NixOS-example"
sudo git config --global user.name "rebrain"
cd /etc/nixos
sudo git init && sudo git add -A && sudo git commit -m "first commit"

Все команды с git выполняем от имени root, так как права папки /etc/nixos принадлежат root пользователю. Теперь мы можем отслеживать свою конфигурацию.

Первоначальная настройка системы завершена. Пройдемся по основным настройкам:

1. generic/nix-config/core.nix

  • imports = [ <nixpkgs/nixos/modules/profiles/hardened.nix> — используем защищенный профиль системы. В некоторых случаях это может привести к снижению производительности.
  • mkOverride 700 — задает приоритет настройкам, если он указан. Например, если в конфигурации servers/example/configuration.nix указать boot.kernelPackages = pkgs.linuxPackages_5_4; то применится последний вариант.
  • boot.kernelPackages = pkgs.linuxPackages_latest_hardened; — указывает применять hardened ядро с патчами https://github.com/anthraxx/linux-hardened.
  • hardware.ksm — активируем дедупликацию памяти, в некоторых случаях позволяет сэкономить ОЗУ.
  • environment.memoryAllocator.provider = mkOverride 700 «jemalloc»; — указывает использовать менеджер памяти Jemalloc.
  • networking.enableIPv6.false; — отключаем ipv6 протокол, так как его не используем.
  • networking.dhcpcd.extraConfig = «\nnoipv6rs \nnoipv6»; — отключаем ipv6 в службе DHCPD.
  • networking.firewall.enable = false; — отключаем файрвол iptables, вместо него используем nftables.
  • networking.useHostResolvConf = false; — используется в контейнерах — использовать resolv.conf от хостовой машины. Отключаем.
  • networking.usePredictableInterfaceNames = false; — возвращаем именование сетевых интерфейсов в ethX, так как у меня в виртуальных машинах используются идентичные интерфейсы и их количество не превышает двух.
  • security.sudo.wheelNeedsPassword = false; — не запрашивать каждый раз пароль перед запуском приложения от имени root. Так как мы используем аутентификацию по ключам, то нет смысла каждый раз требовать пароль.
  • services.journald — ограничиваем размер журналов до 256 MiB.
  • services.qemuGuest — для виртуальных машин активируем QEMU Guest агент. В противном случае, в servers/custom_server/configuration.nix прописываем — services.qemuGuest.enable = false;.
  • users.mutableUsers = false; — запретить смену пароля. Пароль указываем в users.users.my-username.hashedPassword.

2. generic/nix-config/generic/overlays/default.nix

  • nur = import … — здесь добавляем пользовательский репозиторий с программами (полный код в примере).

3. generic/programs/ssh.nix

  • startAgent — активируем ssh agent.
  • pubkeyAcceptedKeyTypes, hostKeyAlgorithms — используем только ssh-ed25519 и rsa-sha2-512 ключи.
  • kexAlgorithms — используем KEX алгоритм curve25519-sha256@libssh.org.
  • ciphers — используем шифр chacha20-poly1305@openssh.com.
  • macs — используем hmac-sha2-512-etm@openssh.com алгоритм аутентификации кода сообщения.
  • extraConfig — небольшие твики ssh клиента.
  • generic/security/ssh-hosts.nix
  • programs.ssh.knownHosts — указываем принудительно публичные ключи известных хостов. По IP можно также добавить другие виртуальные машины, куда требуется доступ по ssh. Если удаленный сервер каким-либо образом подменили, то ssh клиент выдаст ошибку.

4. generic/security/ssh-keys.nix — записываем публичные ключи для ssh аутентификации.
5. generic/services/fail2ban.nix — настраиваем работу утилиты fail2ban c файрволом nftables, добавляем, какие IP-адреса игнорировать. Для сервиса sshd задаем агрессивный метод сканирования.
6. generic/services/syslog-ng.nix — сохраняем логи ssh сервера в отдельный файл.
7. generic/services/logrotate.nix — настраиваем ротацию ssh логов.
8. generic/services/sshd.nix

  • allowSFTP = true; — включаем поддержку SFTP.
  • forwardX11 = mkDefault false; — запрещаем использовать проброс X11. Если требуется проброс X11 приложений, добавляем в файл servers/example/configuration.nix строку services.openssh.forwardX11 = true;.
  • startWhenNeeded = mkDefault true; — запускать SSH сервер только при активации запроса на порт сервиса (активация по systemd socket).
  • permitRootLogin = mkDefault «yes»; — разрешить пользователю root заходить по SSH. Требуется для работы утилиты nixops. Можно отключить, если не используете nixops — «no»;.
  • passwordAuthentication = false; challengeResponseAuthentication = false; — запрещаем вход по паролю.
    useDns = false; — не использовать DNS серверы при аутентификации.
  • macs — используем hmac-sha2-512-etm@openssh.com алгоритм аутентификации кода сообщения.
  • ciphers — используем шифр chacha20-poly1305@openssh.com.
  • kexAlgorithms — используем KEX алгоритм curve25519-sha256@libssh.org. Большинство ssh сканеров будут отваливаться, так как не могут подключиться по указанным алгоритмам.
  • authorizedKeysFiles — использовать открытые ключи авторизации из файлов, удовлетворяющих шаблону /etc/ssh/authorized_keys.d/%u, где %u — имя пользователя.
  • hostKeys — указываем использовать только rsa и ed25519 ключи.
  • extraConfig — небольшие твики sshd сервера.

9. generic/services/unbound.nix — ставим локальный ДНС сервер для кэширования запросов.
10. generic/ids.nix — задаем пользователям фиксированный UID.
11. generic/locale.nix — настраиваем шрифт, кодировку, локализацию, синхронизацию с сервером времени и часовой пояс.
12. generic/pkgs.nix — устанавливаем часто используемые программы.
13. generic/shell.nix — настраиваем shell, алиасы, программу nano и ZSH.
14. generic/tweaks.nix — небольшие твики системы.
15. servers/example/configuration.nix — здесь сохраняем индивидуальные настройки для текущей виртуальной машины example.

    • boot.loader.grub.device = «/dev/vda»; — загружаемся с диска /dev/vda.
    • boot.kernelParams = [ «lockdown=confidentiality» ]; — блокируются возможности, позволяющие вносить изменения в работающее ядро из пространства пользователя, и отключается функциональность, которую можно использовать для извлечения конфиденциальной информации из ядра.
    • servers/example/users.nix — настраиваем пользователя rebrain.
    • hashedPassword — указываем фиксированный хеш пароля. Опция users.mutableUsers = false; позволяет запретить смену пароля из консоли.
    • openssh.authorizedKeys.keys — прописываем открытые указанные в generic/security/ssh-keys.nix публичные ssh ключи, по которым пользователь может авторизоваться на сервере.
    • groups.ssh-users.members — прописываем, каким пользователям разрешен вход по ssh.

16. servers/example/services/fail2ban.nix

    • services.fail2ban.enable — активируем сервис fail2ban. По умолчанию сервис отключен в generic/services/fail2ban.nix.
    • services.fail2ban.jails.sshd — активируем jail sshd.
    • servers/example/services/firefall-nft.nix — активируем файрвол nftables, открываем 22 порт.

В итоге, мы закрыли некоторые ветки атаки и подготовили шаблон, который можно использовать на других системах на базе Linux NixOS.

Немного о Linux NixOS

Теперь подробнее о Linux NixOS. NixOS сохраняет все приложения и различные версии конфигурации системы в собственных подкаталогах директории /nix/store. Например, приложение nano находится в директории /nix/store/17xx786q2gdvjz01hx0j8rihmm5h2m88-nano-4.9.3 и на него создается символьная ссылка:

ls -lah which nano
lrwxrwxrwx 1 root root 63 янв  1  1970 /run/current-system/sw/bin/nano -> /nix/store/17xx786q2gdvjz01hx0j8rihmm5h2m88-nano-4.9.3/bin/nano

Текущая конфигурация системы с установленными приложениями расположена в /run/current-system, которая ссылается на подкаталог в /nix/store

ls -lah /run/current-system
lrwxrwxrwx 1 root root 97 июл 13 12:51 /run/current-system -> /nix/store/r0ly0d2k314wfkmqkbci27hldpy5bplh-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2

При обновлении системы создается подкаталог с новой конфигурацией системы в директории /nix/store и символьная ссылка /run/current-system переключается на нее. В загрузчик grub добавляется новая запись с конфигурацией системы. Добавим программу mysql-client:

sudo nano /etc/nixos/nix-config/generic/pkgs.nix
cd /etc/nixos
git diff
diff --git a/nix-config/generic/pkgs.nix b/nix-config/generic/pkgs.nix
index f4ee2b2..9f6e1d3 100644
--- a/nix-config/generic/pkgs.nix
+++ b/nix-config/generic/pkgs.nix
@@ -14,5 +14,6 @@
inxi lsof sysstat fio
abduco dvtm dtach screen tmux
ccze grc lnav multitail
+    mysql-client
];
}

Сделаем коммит в нашем репозитории:

sudo git add nix-config/generic/pkgs.nix
sudo git commit -m "config: add mysql-client package"

Теперь запускаем обновление системы:

sudo nixos-rebuild switch

У нас установилось новое приложение и символьная ссылка /run/current-system переключилась на новую конфигурацию:

ls -lah /run/current-system
lrwxrwxrwx 1 root root 97 июл 13 13:05 /run/current-system -> /nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2
mysql --version
mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64) using readline 5.1

Примерно так выглядят несколько конфигураций системы в /boot/grub/grub.cfg:

...
menuentry "NixOS - Default" --unrestricted {
search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor
initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd
}
submenu "NixOS - All configurations" {
menuentry "NixOS - Configuration 4 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)"  {
search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/6vn0pwczz9blrm7759iij3k7fmjq0xb2-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor
initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd
}
menuentry "NixOS - Configuration 3 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)"  {
search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/r0ly0d2k314wfkmqkbci27hldpy5bplh-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/r0ly0d2k314wfkmqkbci27hldpy5bplh-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor
initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd
}
menuentry "NixOS - Configuration 2 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)"  {
search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
linux ($drive2)/nix/store/8rzh2pkxb4cxh68cmfk9d0kd4lylx5cd-linux-5.7.7/bzImage systemConfig=/nix/store/6dznb8ackalph62mw6zaan0cpq0ihpfs-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/6dznb8ackalph62mw6zaan0cpq0ihpfs-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init slub_debug=FZP page_poison=1 page_alloc.shuffle=1 lockdown=confidentiality loglevel=4 net.ifnames=0 nohibernate nosmt pti=on kvm-intel.vmentry_l1d_flush=always apparmor=1 security=apparmor
initrd ($drive2)/nix/store/1aj37hakkbww966zk8n8x12xnlqbw839-initrd-linux-5.7.7/initrd
}
menuentry "NixOS - Configuration 1 (2020-07-13 - 20.09pre233323.dc80d7bc4a2)"  {
search --set=drive1 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
search --set=drive2 --fs-uuid 1ea2e5e9-04be-4ae1-9ac4-b7f72602ddfc
linux ($drive2)/nix/store/lhc845bkk8ilfk9xsicqhwcq3ngzay8y-linux-5.4.50/bzImage systemConfig=/nix/store/x9mf5rqwnvbkizhlvd1dcin9wgfb49x3-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2 init=/nix/store/x9mf5rqwnvbkizhlvd1dcin9wgfb49x3-nixos-system-NixOS-example-20.09pre233323.dc80d7bc4a2/init loglevel=4
initrd ($drive2)/nix/store/8f5zvilxc6y0cy05wrc6b5wqabfhd0aq-initrd-linux-5.4.50/initrd
}
...

Параметр systemConfig указывает, какую версию конфигурации использовать для загрузки системы.

Просмотреть текущие конфигурации системы можно командой:

sudo nix-env --list-generations --profile /nix/var/nix/profiles/system

Команда выдаст примерно такой результат:

1   2020-07-13 12:08:28
2   2020-07-13 12:27:27
3   2020-07-13 12:51:09
4   2020-07-13 13:05:37   (current)

Откатимся на предыдущую конфигурацию:

sudo nixos-rebuild switch --rollback
switching from generation 4 to 3
updating GRUB 2 menu...
activating the configuration...
setting up /etc...
reloading user units for rebrain...
...
setting up tmpfiles
reloading the following units: dbus.service
the following new units were started: logrotate.service
Time: 0h:00m:04s

Попробуем запустить mysql:

mysql --version
mysql: command not found

Конфигурация системы откатилась, и теперь у нас программа mysql не установлена.

Вернемся к последней конфигурации:

sudo nixos-rebuild switch

Также любую версию конфигурации системы можно выбрать при ее запуске, в меню grub. Очистить старые конфигурации и освободить место на диске можно командой:

sudo nix-collect-garbage --delete-old

Давайте добавим еще один сервис для мониторинга нашей виртуальной машины. Создаем файл nix-config/servers/example/services/netdata.nix:

sudo nano /etc/nixos/nix-config/servers/example/services/netdata.nix
{
services.netdata = {
enable = true;
};
}

Добавляем его в nix-config/servers/example/configuration.nix:

sudo nano /etc/nixos/nix-config/servers/example/configuration.nix
...
imports =[
...
./services/netdata.nix
./users.nix
];
...

И открываем 19999 порт в файрволе nftables для нашего сервиса:

sudo nano /etc/nixos/nix-config/servers/example/services/firefall-nft.nix
...
chain input {
type filter hook input priority 0; policy drop;
jump checks-base
iif "lo" notrack accept
ip protocol icmp icmp type { echo-request} ct state new accept
tcp dport { 22 } ct state new accept
tcp dport { 19999 } ct state new accept
}
...

Обновляем систему:

sudo nixos-rebuild switch

Сервис мониторинга активирован:

systemctl status netdata
netdata.service - Real time performance monitoring
Loaded: loaded (/nix/store/14jbfi7018j5m75ad4j23sjg811yq26l-unit-netdata.service/netdata.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-07-13 13:33:31 MSK; 6min ago
Main PID: 8484
IP: 124.9K in, 775.6K out
Tasks: 34 (limit: 2373)
Memory: 43.6M
CPU: 13.842s
CGroup: /system.slice/netdata.service
├─8484 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/bin/netdata -P /run/netdata/netdata.pid -D -c /nix/store/f68ak9vl3p2a8b57ypv2cq7r80a8wigc-netdata.conf
├─8491 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/bin/netdata --special-spawn-server
├─8692 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/libexec/netdata/plugins.d/go.d.plugin 1
├─8694 /nix/store/wm8d1lz8rr3i1r9vxgx123mx7rs1r5xh-wrapped-plugins/libexec/netdata/plugins.d/apps.plugin 1
└─8697 /nix/store/0z9dcqk244jb0b95flpljcbs2arg5y52-netdata-1.23.0/libexec/netdata/plugins.d/nfacct.plugin 1
...

Открываем в браузере по 19999 порту и проверяем работу.

Делаем коммит в нашем репозитории:

sudo git add -A
sudo git commit -m "config: add netdata service"

Проверяем изменения в коммите:

git diff HEAD^1
diff --git a/nix-config/servers/example/configuration.nix b/nix-config/servers/example/configuration.nix
index da117ed..d9bf023 100644
--- a/nix-config/servers/example/configuration.nix
+++ b/nix-config/servers/example/configuration.nix
@@ -3,6 +3,7 @@
./../../core.nix
./services/fail2ban.nix
./services/firefall-nft.nix
+    ./services/netdata.nix
./users.nix
];
diff --git a/nix-config/servers/example/services/firefall-nft.nix b/nix-config/servers/example/services/firefall-nft.nix
index afbab23..f6c2648 100644
--- a/nix-config/servers/example/services/firefall-nft.nix
+++ b/nix-config/servers/example/services/firefall-nft.nix
@@ -16,6 +16,7 @@
iif "lo" notrack accept
ip protocol icmp icmp type { echo-request} ct state new accept
tcp dport { 22 } ct state new accept
+          tcp dport { 19999 } ct state new accept
}
chain output {
type filter hook output priority 0; policy accept;
diff --git a/nix-config/servers/example/services/netdata.nix b/nix-config/servers/example/services/netdata.nix
new file mode 100644
index 0000000..e8b5066
--- /dev/null
+++ b/nix-config/servers/example/services/netdata.nix
@@ -0,0 +1,5 @@
+{
+  services.netdata = {
+    enable = true;
+  };
+}

Подводим итоги

Мы немного познакомились с возможностями Linux NixOS, подготовили шаблон для развертывания ОС, закрыли некоторые ветки атаки и добавили историю изменения конфигурации с помощью git-репозитория.

Примечание: Если при обновлении системы возникает ошибка:

updating GRUB 2 menu...
failed to create initrd secrets: No such file or directory
warning: error(s) occurred while switching to the new configuration

То перед обновлением выполняем команду:

sudo rm /etc/ld-nix.so.preload

В последних изменениях была ошибка, которая приводила к некорректной сборке системы из-за использования провайдера распределения памяти — environment.memoryAllocator.provider.

От редакции

Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN

*Анонсы мероприятий каждую неделю

Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.
Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.

Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.

Комментарии (3)
Введено символов из возможных
Не отвечать
Дмитрий Спиридонов

Немного сумбурно и не понятно.

Izorkin

Можете написать какие моменты не понятны, постараюсь дополнить. Спасибо.

Вам также может понравится

Docker – что это такое?
array(1) { [0]=> object(WP_Term)#11557 (16) { ["term_id"]=> int(8) ["name"]=> string(6) "Docker" ["slug"]=> string(6) "docker" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(8) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(8) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(8) ["category_count"]=> int(8) ["category_description"]=> string(0) "" ["cat_name"]=> string(6) "Docker" ["category_nicename"]=> string(6) "docker" ["category_parent"]=> int(0) } } Docker

Если вы считаете, что докер (англ. docker – портовый рабочий) – это тот, кто грузит контейнеры, вы правы по форме, но не по содержанию. В нашем случае Docker – это действительно удобный интерфейс для работы с контейнерами. Но не только. Давайте разбираться, что это такое и с чем его едят.

Docker – это программная платформа, которая помогает...

3
0
2 октября 2020
Как посмотреть открытые порты Linux
array(1) { [0]=> object(WP_Term)#976 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(28) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(28) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

Во время устранения неполадок служб, работающих на ОС Linux, просмотр открытых портов является одной из задач, которую должен выполнять любой пользователь или администратор. Если служба должна по идее работать, но по какой-то причине она не работает, то, скорее всего, порт этой службы закрыт и его нужно открыть.

В этом туториале мы покажем, как...

21
0
28 мая 2020
Лучшие книги по DevOps
array(1) { [0]=> object(WP_Term)#11557 (16) { ["term_id"]=> int(7) ["name"]=> string(6) "DevOps" ["slug"]=> string(6) "devops" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(7) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(19) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(7) ["category_count"]=> int(19) ["category_description"]=> string(0) "" ["cat_name"]=> string(6) "DevOps" ["category_nicename"]=> string(6) "devops" ["category_parent"]=> int(0) } } DevOps

Погружение в тему DevOps – это тот путь, который потребует от вас постоянного самосовершенствования и изучения новых технологий. К сожалению, вы не станете специалистом без практики, даже если прочитаете тысячу самых лучших книг. Но тем не менее, книги по DevOps могут помочь систематизировать знания и подсказать некоторые приемы и навыки,...

4
0
25 мая 2020