Из коробки yggdrasil запускается от имени пользователя root, что нежелательно. Тем не менее, похоже, что CAP_NET_ADMIN - это все, что необходимо для запуска yggdrasil от имени непривилегированного пользователя.

В 6 простых шагов

1: установить capabilities

1
$ sudo setcap CAP_NET_ADMIN+eip /usr/bin/yggdrasil

2: Создать непривилегированного пользователя с собственной группой

1
$ sudo useradd -c Yggdrasil -d / -M -r -U -s /sbin/nologin yggdrasil

3. Сделайте конфигурационный файл читабельным для пользователя yggdrasil

1
2
3
4
$ sudo chmod 0640 /etc/yggdrasil.conf
$ sudo chown root.yggdrasil /etc/yggdrasil.conf
$ sudo chmod 0750 /usr/bin/yggdrasil            # not world readable
$ sudo chown root.yggdrasil /usr/bin/yggdrasil  # user root; group yggdrasil

4. Установите user и rundir в systemd.service

Добавьте следующие строки в раздел [Service]:

1
2
3
4
5
6
[Service]
# See systemd.exec(5) for details
User=yggdrasil
Group=yggdrasil
RuntimeDirectory=yggdrasil
RuntimeDirectoryMode=0750

5. Установите socket администратора в yggdrasil.conf

Если вы используете socket администратора, убедитесь, что его местоположение в /etc/yggdrasil.conf совпадает с RuntimeDirectory в (4):

1
2
3
4
5
6
7
# Listen address for admin connections. Default is to listen for local
# connections either on TCP/9001 or a UNIX socket depending on your
# platform. Use this value for yggdrasilctl -endpoint=X. To disable
# the admin socket, use the value "none" instead.
AdminListen: unix:///run/yggdrasil/yggdrasil.sock
# Some distros still use /var/run:
# AdminListen: unix:///var/run/yggdrasil/yggdrasil.sock

6: Перезапустить эту чертову вещь

1
2
$ sudo systemctl daemon-reload  # make sure systemd uses our new service file
$ sudo systemctl restart yggdrasil.service  # actually restart

И это все!

Если все прошло хорошо, вы должны увидеть что-то вроде

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 yggdrasil.service - yggdrasil
   Loaded: loaded (/etc/systemd/system/yggdrasil.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-11-03 18:34:07 CEST; 50min ago
 Main PID: 27421 (yggdrasil)
    Tasks: 15 (limit: 4915)
   Memory: 7.9M
   CGroup: /system.slice/yggdrasil.service
           └─27421 /usr/bin/yggdrasil -useconffile /etc/yggdrasil.conf

Nov 03 18:34:07 home yggdrasil[27421]: 2019/11/03 18:34:07 Listening for TCP on: [::]:$PORT
Nov 03 18:34:07 home yggdrasil[27421]: 2019/11/03 18:34:07 UNIX admin socket listening on /run/yggdrasil/yggdrasil.sock

при запуске systemctl status yggdrasil.service.

Смотрите также

  1. Настройка capabilities

    • setcap (8)

    • capabilities (7)

  2. Создание непривилегированного пользователя

    • useradd (8)
  3. Файловые права

    • chmod (1)

    • chown (1)

  4. yggdrasil.service

    • systemd.exec (5)
  5. yggdrasil.conf

  6. Перезапуск yggdrasil

    • systemctl (1)