remote work

Dec. 9th, 2025 08:32 am
vitus_wagner: My photo 2005 (Default)

Использовать RaspBerry PI в качестве рабочего места мне понравилось. Тишина, легко сосредоточиться. Только вот беда - диски-то присоединены к большому компьютеру. В принципе у пишки хватает мощности на современный браузер, почтовый клиент, либреофис. Но как только надо работать с тем, что сохранено локально, надо идти по ssh на большой компьютер. А там pdf-ы, фоссиловский web ui и прочее что требует локального запуска программ.

А файрфокс через ssh X-forwarding работает что-то медленно. Потому что ethernet порты у роутера стомегабитные. Не искать же другой роутер. Впрочем может быть это еще и оверхед на шифровaние заметен.

Сначала я подумал о том, чтобы примонтировать его диски. Но как-то nfs настраивть лениво. Тем более, что NFS как-то хреново относится к server outages. Из самбы нынче выпилили smbmount, и монтировать на ходу стало довольно неудобно. А smb в принципе требует монтирования в каждой пользовательской сессии отдельно.

И тут я вспомнил что когда-то настраивал свой lightdm на работу с VNC как со вторым X-display.

Попробовал, получается.

Конечно, протокол spice был бы лучше vnc, Он позволяет редиректить звук (но у rasberry pi нет колонок) и USB-устройства (но у Raspberry pi ограничена мощность, вряд ли она что кроме флешки потянет). Кстати, не уверен, что все это умеет раздавать Xspice,

vitus_wagner: My photo 2005 (Default)

В связи с кончиной десктопа остался без рабочей инсталляции XEphem.

А как же мне без этой программы распланировать рейс корабля пришельцев по Солнечной системе?

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

Вообще конечно кто-то уже собирал deb-пакеты для убунту. Но скачать debian.tar.xz c opensuse build system почему-то не получается. Во всяком случае без регистрации.

А какая там убунту, какая в ней версия motif и libc - не написано.

Так что потратил примерно час времени и сделал свои пакетировочные файлы.

И залил на github

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Решил тут попробовать перейти на одном из ноутбуков с конфигурации сети с помощью пакета ifupdown на использование systemd-networkd. А то мне как-то начинает казаться что ifupdown постепенно перестает развиваться и поддерживаться.

А systemd в системе все равно держать приходится. Потому что без него половина нынешнего десктопного софта работает как-то странно.

На серверах и сборочных контейнерах я уже как-то давно использую systemd-networkd там где дистрибутивный способ конфигурирования сети не срабатывает без вмешательства человека. В смысле. если сеть завелась сама, то пусть работает. А если надо разбираться в какой-нибудь очередной etcnet, то лучше ее оторвать и делать через systemd, он везде одинаковый.

Требования к конфигурации сети на ноутбуке у меня следующие:

  1. Есть три интерфейса - wifi, ethernet и внутренний бридж для контейнеров и виртуальных машин.
  2. По умолчанию работает wifi, но если в enhernet воткнули кабель, то он лучше.
  3. Есть кэширующий DNS-сервер, он же резолвит имена виртуалок и контейнеров, поэтому единственным сервером в /etc/resolv.conf должен быть он.
  4. Виртуалки маскарадятся.
  5. Надо использовать DNS-сервера выданные по DHCP, потому как мало ли в какой сети ноутбук окажется. Т.е. инструмент конфигурировани сети должен уметь подсунуть dnsmasq-у правильный resolv-файл, и этот файл не должен называться /etc/resolv.conf.

Для этой цели потребовалась следующая конфигурация

1) enable-м сервис wpa_supplican@имя-интерфейса (вот пусть тому уроду, который придумал интерфейсы переименовывать, икнется). Конфиг к нему вполне подошел тот же самый, какой использовался для ifupdown. Пришлось только переименовать из просто wpa_supplicant.conf в wpa_wsupplicant-имя-интерфейса.conf.

Для тех, кто раньше wpa_supplicant-ом не пользовался - советую обратить внимание на опции сtrl_interface и update_config. Если у вас в ctrl_interface написана группа, в которую консольный пользователь входит, например netdev, то это позволит коннектиться всякими инструментами конфигурирования, например wpa_gui. Ну и update_config нужен для того чтобы сохранить то, что с их помощью конфигурировали. И то, и другое жизненно необходимо если вы периодически подключаетесь к ранее незнакомым сетям, например во всяких кафе.

2) то же самое проделываем с сервисами systemd-resolved и systemd-networkd (казалось бы зачем нам resolved? Он только мешает, пытаясь прибиндиться к 53 порту localhost, где у нас должен быть dnsmasq). Но нет, нам нужно чтобы systemd-networkd передал ему по d-bus адреса dns-серверов, а тот прописал их в /run/systemd/resolve/resolv.conf. А чтобы отучить его занимать порт, пропишем в /etc/systemd/resolved.conf DNSStubListener=no.

3) Прописываем /run/systemd/resolve/resolv.conf в как resolv-file в /etc/dnsmasq.conf

4) пишем файлы конфигурации интерфейсов. У Wi-Fi он совсем простой

[Match] Name=wlp* [Network] DHCP=yes А вот эзернету надо еще указать

[Link] RequiredForOnline=no

Что касается бриджа, там конфиг наиболее сложный. Потому что если раньше в /etc/network/interfaces были post-up команды с помощью которых можно было включить в ядре форвардинг, или там маскарад для этого интерфейса. то теперь у systemd-networkd отдельные ключевые слова на каждый такой случай. Ну это общее правило systemd. Ничего не делается обычными командами, для всего предусмотрены специальные опции в конфиге. а если не предусмотрены, то вам не повезло.

Впрочем зачем вообще держать форвардинг выключенным не понимаю, поэтому его можно включить глобально, добавив соотвествующее правило в /etc/sysctl.d. А для настройки маскарда воспользоваться nftables. Хотя вот тут, похоже сервис, предоставленный systemd-networkd будет не лишним.

vitus_wagner: My photo 2005 (Default)

Тут вчера тестировал отправку почты постфиксом с ноутбука через новый сервер и обнаружил, что ноутбук не получает дефолтного маршрута ipv6. А postfix почему-то упорно ломится по 6-му протоколу, увидев на интерфейсе globally routable ipv6 адрес.

Ну ладно, postfix я отучил от этой привычки, прописав ему inet_protocols=ipv4 (smtp_address_preferable почему-то не помогло).

Но надо же понять, в чем дело. Нагугли что оказывается, еще лет десять назад в ifup была выявлена проблема, что он запрещает на интерфейсе прием routing advertisments. И если прописать в /etc/network/interfaces post-команду, которая вернет это назад, то все начинает работать. (хотя вроде могли бы исправить. Видимо ifupdown пользуются только жуткие консерваторы, которые и ipv6 не любят. А я консерватор непоследовательный - network manager не люблю, в ipv6 люблю, хотя и не умею).

Вот теперь думаю, может быть отказаться от ifupdowm в пользу systemd-networkd? Когда я пас стада контейнеров с разными линуксами я частенько использовал systemd-networkd если не мог сходу справиться с дистрибутиво-специфичным методом настройки сети. Он с одной стороны не настолько overengineered как network manager, а с другой - довольно функционален. И самое главное - он ВЕЗДЕ одинаковый. Во всех современных дистрибутивах. И у него с настройкой на ipv6 все нормально по крайней мере в случае dhcp6. На десктопе я его когда-то сконфигурировал (тоже что-то ifupdown сглючил) и забыл с тех пор.

А способ настройки wifi интерфейсов с отдельным wpa_supplicant там предусмотрен, поэтому переучиваться на интерфейс, отличный от wpa_gui не придется.

Главное added value которое с него вроде бы можно получить - это бесшовный переход с wifi на ethernet и обратно. В ifupdown все же не совсем бесшовно получается.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Собрался, наконец, доделать последнюю задачу из области сетапа нового сервера - web-based xmpp-клиент. Теперь у меня есть не только webmail, но и web-jabber. (надо сказать что установить на предыдущий сервер element я собирался гораздо дольше).

После отбрасывания из списка того что есть на xmpp.org совершенно галимой проприетарщины, осталось три кандидата

jsxc, xmpp-web и converse.js.

Первый хорош тем, что присутствует в дистрибутиве в виде пакета libjs-jsxc. Поэтому начал я с него. Но к сожалению, документацию в пакет положить забыли, а по документации на сайте как-то тяжело разобраться с тем, что уже сделал мейнтейнер пакета, а что надо сделать пользователю. Ну и вообще он хочет устаревший интерфейс к xmpp-серверу. Работает только через bosh, а через websockets не умеет.

Второй у меня сходу не заработал (возможно, потому что был недоконфигурирован то ли модуль websocket в prosody, то ли прокси в апаче). Показывал черную страничку и никаких сообщений об ошибке.

Вот converse.js удалось достаточно просто настроить. К тому же она, в отличие от xmpp-web не требует отдельного виртуального хоста и инструкция по установке не предполагает что файлы скриптов должны принадлежать пользователю www-data (c моей точки зрения файлы скриптов, которые может писать процесс веб-сервера это нехорошо).

Converse.js умеет много чего, в частности OMEMO. А вот аудио-видео звонков, увы, не умеет.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Вот задумался над тем что применить на новой vds-ке для управления файрволлом.

Раньше у меня был iptables-persistent, но сколько можно, iptables уже лет пять как deprecated.

В Debian умолчательным способом считается юнит nftables, который просто загружает вручную напсанный конфиг. Есть еще nftables-persistent, который работает так же как iptables-persistent т.е. сохраняет конфигурацию, а потом ее загружает, но средствами nftables.

Есть ufw, который использует bsd-шный синтаксис, а есть firewalld, который имеет крайне развесистую схему конфигурации. Насколько я понял firewalld, это попытка сделать из linux андроид, т.е. передать контроль над ситуацией от пользователя/сисадмина авторам приложений. Впрочем как я почитал ченджлоги systemd 258, идея сделать из линукса андроид потихоньку овладевает массами.

Мне, естественно, концепция firewalld не понравилась. Тем более что в имеющемся наборе конфигов как-то путаница между приложениями и протоколами. Например для imap, imaps, и managesieve - разные конфиги. Хотя сервис один и тот же.

Вот теперь думаю, nftables или nftables-persistent. Первый заставит выучить новый синтаксис (вообще-то давно пора), со вторым можно по-моему договориться, используя синатксис iptables (через iptables-nft).

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

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

Тем более, что я сначала себе заказал виртуалку с Debian 13, а потом стал понемногу туда переносить конфиги и данные с бэкапа виртуалки, работавшей под debian 12, причепм многие из конфигов и скриптов там не редактировались со времен Debian 10, если не 9.

Конфигурацию dovecot пришлось полностью с нуля переписывать. Там синтаксис поменяли во многих местах по мелочи, но несовместимо. Теперь, правда, конфиг начинается с указания версии языка конфигурации. Так что можно будет долго не трогать.

В спамассасине auto_whitelist заменили на auto_welcomelist.

Обнаружил, что у меня скрипт для менеджмента почтовых юзеров и паролей в базе sqlite до сих пор написан на втором питоне. Быстренько поправил и довел до 10 баллов в pylint. В принципе там 2to3 бы справился, но мне было проще руками поправить, чем разбираться с использвоанием 2to3 - скрипт там близок к тривиальному.

Вот вебовский вариант смены паролей надо будет переделать. Я все защищенные области в http пересадил на ту же sqlite-вскую базу, которую использует dovecot.

Матрицу решил выкинуть. Равно как и openid-провайдера. Черт те сколько лет никуда по openid не логинился. А матрица оказалась абсолютно бессмысленной в качестве канала посылки сообщений от роботов на смартфон - пока клиент не откроешь, он не видит что что-то приходило. Чтобы видел, нужно к мобильному клиенту какой-то сервис нотификации прикрутить - либо Google Play, либо ntfy, либо jabber. Так уж проще jabber и использовать без нахлобучек в виде матрицы. Благо веб-клиентов к нему теперь море - он через вебсокеты работать научился, и вебклиенты есть даже в дистрибутиве. И dovecot sasl prosody умеет из коробки. В отличие от матрицы с ее стремлением перелезть на oauth. Но, увы, старых конфигов prosody у меня в бэкапах не сохранилось. Отротировались уже. Придется тоже с нуля делать. Посмотрим, научились ли за последние 5 лет jabber-клиенты аудио-видео звонкам. В начале ковида оно работало как-то плохо.

vitus_wagner: My photo 2005 (Default)

Debian 13 (trixie) вышел. Одной из основных особенностей этого релиза является отказ от поддержки 32-битной Intel-архитектуры (i386). Теперь из семи официально поддерживаемых архитектур 32-битных только два arm (armel и armhf). И кстати, из big-endian архитекур остался только s390x, ибо мейнфреймы IBM бессмертны. Но тоже - никаких 31-битных версий.

У меня вообще-то уже два рабочих ноутбука сапгрейжены - свой (chara) и Ирины (izar, она в связи с тем что ее виндовый Asus, который eltanin, сдох, пользуется сейчас моим старым ноутбуком). Надо два 12" "ноутбука для путешествий" (thuban и achird) поднять и домашний десктоп.

Стоит ли поднимат canopus - не уверен. Возможно надо завести vps-ку у другого хостера, назвать, например, deneb, поставить туда trixie сразу и перенести нагрузку туда. А canopus сдохнет когда кончится заплаченные за хостинг деньги.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Разобрался тут, как использовать опцию -w у ssh. Надо будет в рассказку дописать.

Токен %T в LocalCommand вполне работает. А на серверной стороне у команды которая передана в командной строке ssh есть переменная среды SSH_TUNNEL.

Получилось следующее:

  1. На сервере требуется опция PermitTunnel yes и PermitRootLogin yes в глобальном sshd_config и у рута в .ssh/authorized_keys ключи клиентов. Надо их ограничить, чтобы ничего лишнего не делал, прописав там command и прочее
  2. На клиенте в глобальном ssh_config PermitLocalCommand yes
  3. На сервере в /usr/local/bin скриптик sshnetsetup
  4. На клиенте в /usr/local/bin sshnetclient и sshvpn
  5. На клиенте в /etc/ssh файлиk vpn.conf, содержащий следующией настройки

```

 # !/bin/sh
 # Config file for  ssh vpn   

 # DNS name of server to connect to (required)
 SERVER=example.com
 # IP of this computer in VPN (required)
 MY_IP=192.168.217.194
 # IP of server in VPN (required)
 SERVER_IP=192.168.217.193
 # network to route via server (optional)
 NET=192.168.217.128/25
 # Port for dynamic port forwarding (optional)
 SOCKS_PORT=1080

```

SERVER - это имя сервера куда ходить по ssh в открытом интернете. А MY_IP и SERVER_IP - "серые" адреса внутри vpn. SOCKS_PORT - это чтобы не держать отдельной ssh-сессии для ssh -D, NET - это если нам сеть нужна не для обхода блокировок. а как виртуальная частная сеть, объединяющая наши компьютеры, вошедшие в интернет через разных провайдеров. На каждом клиенте для рута генерируется ключевая пара ssh и открытый ключ помещается руту на сервер.

На этом настройка заканчивася. Дальше запускаем sshvpn, оно устанавливает соединение и voila.

Скрипт sshvpn имеет следующий вид:

  #!/bin/sh
  if [ "$(id -u)" -ne 0 ]; then
     sudo "$0"
     exit "$?"
  fi
  if ! [ -f /etc/ssh/vpn.conf ]; then
      echo "No /etc/ssh/vpn.conf found"
      exit 1
  fi
  . /etc/ssh/vpn.conf
  ssh -w "any:any" -o LocalCommand="sshnetclient %T"  ${SOCKS_PORT:+-D "localhost:$SOCKS_PORT" }"$SERVER" sshnetsetup "$MY_IP"

Собственно интересны тут две последние строчки - прочитать конфиг и запустить ssh c кучей параметров из этого конфига. На клиенте в резулаьте выполнится следующий скрипт

#!/bin/sh
. /etc/ssh/vpn.conf
DEVICE="$1"
ip addr add dev "$DEVICE" local "$MY_IP" peer "$SERVER_IP"
ip link set "$DEVICE" up
[ -n "$NET" ] && ip route add "$NET" via "$SERVER_IP"

Он прочитает тот же конфиг и сконфигурирует интерфейс, имя которого ему передано в командной строке через токен %T (см раздел TOKENS в man ssh_config)

На сервере выполняется вот такой скрипт:

#!/bin/sh
client=$1
if  [ -z "$client" ]; then
    client="${SSH_ORIGINAL_COMMAND##* }"
fi
ip addr add 192.168.217.193 peer $client dev $SSH_TUNNEL
ip link set $SSH_TUNNEL up
# now wait until other side would break connection
cat

Он конфигурирует интерфпейс указанный в переменной среды SSH_TUNNEL в переданный ему в командной строке из клиентского sshvpn IP-адрес, а потом запускает команду cat, т.е. ждет ввода на stdin до упора. Пока SIGINT не прилетит. Если в authorized_keys мы пропишем command=/usr/local/bin/sshnetsetup, то параметр $MY_IP sshd в скрипт не передаст. Зато засунет оригинальную команду в SSH_ORIGINAL_COMMAND, откуда этот адрес мы и выкусываем. Особые параноики могут там использовать какой-нибудь sed, чтобы убедиться что ORIGINAL_COMMAND это действительно sshnetsetup ip-address.

При таком сетапе, когда IP-адреса клиентам назначаются явным образом и прописываются на клиентах же в конфиг, нет необходимости что-то делать с динамическим DNS можно всех клиентов статически прописать.

Теперь бы еще разобраться как совместить это дело с SessionType=none (aka -N) и RemoteCommand.

vitus_wagner: My photo 2005 (Default)

У ssh есть, как известно, ключик -w который позволяет аллоцировать на обоих концах виртуальный сетевой интерфейс и гонять через свое ssh-соединение любой траффик.

К сожалению никакого удобного сервиса, аналогичного тому что есть почти у всех прочих фич ssh вокруг этой опции не сложилось.

Получается следующее

  1. На обоих концах пользователь должен быть рутом, а то будет ошибка device setup failed.
  2. Команды для конфигурирования интерфейа и маршрутов нужно запускать самому, никакого сервиса не предусмотрено.
  3. Предусмотрена возможность передачи имени аллоцированного интерфейса в команды, указанные как LocalCommand и RemoteCommand, но у меня что-то нифига не получилось.

Соответсвенно встает задача как организовать работу по схеме "звезда". Т.е. когда есть n девайсов, которые могут ходить по ssh на некий центральный сервер, и данный сервер должен им устроить полноценную виртуальную сеть, вне зависимости от того, сколько из них и в каком порядке пришли. Полноценную, это значит что они видят не только сервер и выполняющиеся на нем серверные процессы (dovecot, postfix, http-proxy), но и друг друга. Поичем друг друга полноценным способом.

Ну собственно, очевидный вариант - прописать каждому девайсу при его настройке номер tun-интерфейса, который оно должно запрашивать на сервере, а дальше в зависимости от этого номера плясатьj, назначая IP.

Интерфейс у них там по умолчанию point-to-point но можно включить режим ethernet. Правда не совсем понятно есть ли в этом хоть какой-то смысл.

Этот вариант мне не нравится, но сойдет для сельской местности.

Далее, у команды которая выполняется в ssh-сессии может быть переменная вреды SSH_USER_AUTH, указывающая на файлик, где лежит инфрмация о пользовательском ключе. (Чтобы ее включить, в sshd_config напишите ExposeAuthInfo yes) можно взять этот файлик, прочитать его, потом поискать сооответствующий ключ в authorized_keys и найти там последним полем комментарий, который как правило, содержит имя машины, на которой сгенерена ключевая пара. Дальше уже танцевать от имени машины. Это удобно, если все клиенты - линуксовые машины и админ серевра все равно знает их по имени (что, впрочем, необхдимо и для того, чтобы пользователи могли с одной машины к другой обращаться по имени).

Все примерны, которые мне удалось нагуглить в интернете, используют ifconfig. Он у нас вроде как deprecated, хотя в пакет net-tools в trixie поставляется.

Но аналогичных результатов можно добиться и с использованием iproute2.

  ip addr set $address peer $serveraddress dev $device
  ip link set $device up

на клиенте

  ip addr set $serveraddress peer $adddess dev $device
  ip link set $device up

на сервере.

Вообще, видимо, самое логичное - запускать ssh с ключиком -w из скрипта передавая на сервер в параметрах и номер интерфейса и ip-адрес. Это несколько менее удобно чем хранить всю конфигурацию на сервере, но что делать.

vitus_wagner: My photo 2005 (Default)

Обнаружил в trixie еще две проблемы, кроме вчерашней со сканированием из GIMP 3.0

Надо будет баги зарепортить.

1) Не работает XKBOPTIONS=compose в /etc/default/keyboard. В смысле не долетает, видимо до X-сервера. В качестве workaroun можно определить Multi_key через xmodmap. Но вообще без compose грустно. Не через диграфы же в vim-е знаки препинания вставлять.

xmodmap -e 'keysym Control_R = Multi_key'

в .xsessionrc. Вместо Control_R можно поставить что-нибудь другое но у меня в /etc/default/keyboard было написано именно compose:rctrl

2) Почему-то сегфолтится spacefm при отмонтировании диска, который открыт в текущем окне. Раньше он так не делал а спокойно переходил в ${HOME}. C этим еще немножко поразбираться надо, потому что версии вроде в bookworm и trixie одинаковы, менялись только опции сборки.

vitus_wagner: My photo 2005 (Default)

Cапгрейдил первую железку (основной рабочий ноутбук, Хару) на Debian 13. Которому до выхода еще месяца полтора, есле не два.

Раньше я как-то всегда начинал рабочие машинки апгрейдить за несколько месяцев до выхода. Это bookworm вышел внезапно в июне, а не в августе, и я тогда все апгрейдил после выхода.

А сейчас вот мне приспичило чтобы у меня libssl-dev был версии 3.5.0, а не 3.0.16. Можно было бы конечно отдельную openssl собрать для экспериментов. Но пока проще так.

Первое что обнаружил - поторопились они там переходить на GIMP 3.0. ох, поторопились. Потому что пакет sane (который в исходниках sane-frontends) и xsane еще не готовы к новому интерфейсу плагинов. Похоже что их никто толком не мейнейнет, в результате чего sane (содержащий xsanimage, scanadf и xcam) из дистрибутива вообще выпал в ходе стабилизации, а xsane как был 0.999 так и остался, даже в sid, хотя для gimp3 нужен 1.0 (который еще не вышел. Но коммиты с поддержкй 3.0 там уже в мастер влиты). Пришлось скачать маленький (103 строки) питоновский скрипт xsanecli.py.

Надо еще разобраться, что они там намутили с перездом от FreeRDP2 к FreeRDP3. Не то чтобы мне был сейчас так уж нужен RDP-клиент. Рабочих виндовых виртуалок куда нужно ходить по RDP у меня сейчас нет. Но там интересные вещи вроде proxy и раздачи своей существующей сессии по протоколу rdp.

Ну и еще выпал из дистрибутива utox. Не больно-то и хотелось. Не прижился он у меня. Можно, конечно, qtox поставить.

vitus_wagner: My photo 2005 (Default)

Тут некоторое время назад обнаружились проблем с работой матричных клиентов. Причем всех. Ну как минимум nheko и fluffychat страдали.

Выяснилось что почему-то перестали работать клиентские соединения на 8448 порт. На 443 все работает и после перенастройки клиентов все стало летать.

При этом synapse продолжает слушать на этом порту и openssl s_client к нему вполне коннектится.

Вопрос в том, а должно ли работать в таком режиме s2s. Ау. [personal profile] nataraj, может потестируем?

Синапс вроде не обновлялся. Сейчас packages.debian.org его вообще ни в bookworm-backports, ни в trixie не показывает. Как выйдет trixie, придется, наверное из sid ставить.

У меня, конечно сразу возникло предположение что это злобный мегафон стал резать https-соединения на нестандартные порты. Если так, то s2s в безопасности - серверов никто в мобильном интернете не держит.

vitus_wagner: My photo 2005 (Default)

Нашел вот в дистрибутиве пакет libpam-ssh-agent-auth и вот теперь думаю, а повысится ли безопасность моего сервера, если я его буду использовать.

Работает эта штука так - прописывается в /etc/pam.d/sudo и аутентифицирует пользователя желающего сделать sudo, если у него имеется работающий (отфорварженный) ssh_agent с доверенными ключами.

Какому файлу доверять - прописываается в /etc/pam.d/sudo. Можно прописать свой рабочий ~/.ssh/authorized_keys, можно для желающих пользоваться sudo завести отдельный файлик где-нибудь в /etc/.

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

Но главное вообще-то не в этом. Главное в том, что если у нас sudo с паролем, то вообще говоря оно уязывимо к установке keylogger, а вот ssh-вый агент использует криптографию с открытыми ключами, и поэтому не боится перехвата чего либо на стороне сервера.

Но у пароля есть крайне полезное свойство - если на локальной и удаленной машине пароли разные, то когда юзер перепутает окно и наберет не на той машине, пароль не подойдет и команда не выполнится. Вероятность перепутать окно, несмотря на то что prompt-ы разноветные и содержат имя машины - намного выше вероятности хакерской атаки.

Хотя вот на работе жил я с NOPASSWD в sudoers (там было слишком много серверов и контейнеров, чтобы везде пароли расставлять) и ничего.

P.S. Соберетесь настраивать у себя, не забудьте прописать в /etc/sudoers, что environment кирпичом не чистят переменную SSH_AUTH_SOCK из environment удалять не надо. А то не найдет вашего агента.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Решил тут прикрутить к openwrt-шному web-интерфейсу сертификат, которому браузер бы доверял. Выяснилгось что выученный четверть века назад способ генерации сепртифкатов с помощью скрипта CA.pl для этого не годится.

Потому что там хостнейм пишется в CN. А мозилле теперь подавай обязательно dns name в subjectAltName.

Правда, команда openssl req в 3-й версии openssl зато научилоась ключику -addext. Поэтому сгенерировать правильную заявку на сертификат (после подписания которой тем же CA.pl палучается правильный сертификат) можно безо всяких скриптовых обвязок.

 openssl req -newkey -keyout mysite.key -out mysite.req -subj "/CN=mysite.domain/C=RU/L=Moscow" \
    -addext "subkectAltName=DNS:mysite.domain"

Надо еще покопаться. может еще и вокруг openssl ca скрпитовая обвязка тоже лишняя, и можно непосредственно ей пользоватья.

Еще выяснил что в /usr/local/share/ca-certificates на десктопе у меня лежит уже два года как заэкспайрившийся сертификат моего собственного CA. Последнее время я этот CA использовал исключительно для openvpn, потому что все, что торчит во внешний интернет испольузет сертификаты с Let's Encrypt, а локальные https-сайты в своей домашней сети я как-то не очень использую.

vitus_wagner: My photo 2005 (Default)

Тут призадумался о том, как бы избежать хранения одних и тех же паролей одних и тех же юзеров в пяти разных местах с тремя разными способами хэширования. Это не столько к гипотетическому проекту admin-less сервера, сколько к моему собственному серверу.

Сейчас у меня там есть dovecot и postfix. Postfix за аутентификацией ходит к dovecot. Соответственно, протоколы imap, sieve и smtp используют единую базу пользователей. web-мейл, естественно, тоже так как аутентифицируется об imap.

Кроме этого у меня есть несколько областей на веб-сервере, закрытых basic authentication (среди них прокси к radicale, но radicale не использует собственной аутентификации, полагаясь на апачесвкую) и matrix-synapse.

У matrix-synapse есть систеама аутентификационные плагины. А на pypi модуль dovecot который умеет аунтинфицироваться об dovecot'овский sasl. Правда, не обновлялся лет 15. Но в дистрибутиве есть пакет python3-radicale-dovecot-sasl, откуда можно выдрать несколько более свежий код аутентификации через dovecot sasl. Всего 6-летней давности.

Для apache тоже есть mod_authn_dovecot. Тоже не шибко активно развиваемый.

Так что по идее можно пересадить всех на использование dovecot-овского sasl. Я правда, несколько не уверен что это является наилучшим решением. Учитывая, что эти клиенты к довекотовскому sasl какие-то слишком не развивающиеся. В наше время это как-то подозрительно.

Но из других разумных вариантов, которые бы поддерижвались сразу dovecot, postfix, synapse и apache наблюдается по-моему только ldap, а ldap это немножко оверкилл для единственной машины с четырьмя сервисами.

Dovecot, кстати, у меня держит пароли в sqlite. И больше в этой базе не держит ничего.

Upd Подумал, что может быть наиболее правильным решением будет всех (кроме postfix, который с dovecot уже умеет договариваться) аутентифицировать непосредвтсвенно по sqlite-базе с которой работает dovecot, Для apache это точно решается штатными средствами. Если только используемое dovecot-ом шифрование совместимо с apr. А dovecot использует стандартный crypt(3), А для синапса так и так провайдер аутентификации писать.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Тут при оченедном обсуждении мессенждеров [personal profile] vikarti_anantra задала вопрос: "А что сложно свой сервер поднять?".

Сложно. Для тех для кого адмнистрирование юникс-систем не является основной работой, поднять сервер и сконфигурировать на нем пяток нужных сервисов - занятие и правда не простое. Другой вопрос, что уже давно можно было бы, если бы существовал хоть какой консенсус на тему того, что на таком сервере должно быть, следать коробку "все в одном", настраивать которую было бы не сложнее, чем типичный Wi-Fi роутер. А с ними вроде народ в массе своей справляется. И чтобы можно было в течение нескольких минут накатить этот образ на виртуалку на любом VPS-хостинге.

Что собственно, нужно от точки присутствия в интернете? Предполагается что это может быть не только личная точка присутствия, но и семейная или небольшой группы единомышлинников, вроде мастерской группы LRPG.

  1. Сервер электронной почты на пару десятков аккаунтов. При этом чтобы почту с него принимали во всяких gmail-ах (а это, увы, moving target), и чтобы была какая-никакая защита от спама. graylisting+spamassassin вполне хватает по моему опыту.
  2. Веб-интерфейс к этой почте. А то вдруг придется доступаться из какого-нибдуь интернет кафе, где ничего кроме браузера не предусмотрено.
  3. Сервер федерированного мессенжера (matrix или jabber).
  4. К нему тоже web-интерфейс (element)
  5. turn-сервер, как совершенно необходимая вещь для голосовых и видеозвонокв через matrix/jabber
  6. CalDAV/CardDAV сервер
  7. Возможность выложить файл для последующего скачивания. Я в общем обхожусь для этого webdav. Хотя возможно web-based файл-менеджер не помешал бы. В принципе этого уже достаточно для того чтобы сделать сколь угодно навороченный статический web-сайт, благо локальных генераторов сайтов, запускаемых на ноутбуке/рабочей станции существует море. Поэтому пока вам не нужно на сайте комментирование, ничего более другого и не нужно.
  8. Фотогалерея. Она отдельно, потому что фотграфируют нынче в основном смартфонами и планшетами, следовательно фотографии должны попадать на сайт непосредственно с мобильного устройства, и минимально обрабатываться уже на сервере.
  9. Средства администрирования. Должны позволять завести нового юзера всего предыдущего, заблокировать/удалить старого, сменить пароль. Возможно стоит жестко требовать наличия единого пароля для всего перечисленного, а возможно и нет. Возможно, тот же инструмент должен менеджить authorized_keys для доступа по ssh. Тут, правда, стоит подумать о соотношении системных пользователей и пользователей веб-сервисов (по-моему не должны совпадать). Там же должна быть кнопочка для установки апдейтов.
  10. Автомат для обновления сертификатов Let's Encrypt
  11. DNS-сервер. Дело в том, для значительной части вышеприведенных сервисов нам понадобятся специальные (SRV, TXT) записи в DNS. Да, и электронной почты это тоже касается. Без TXT-записи _dmarc никто почту принимать с вашего домена не будет. Опять же openpgp-ключи так публиковать можно. Но в общем стоит исходить из того, что именно этот сервер будет первичным DNS вашего домена. Тогда все этои нетривилаьные DNS-записи можно будет автоматизировать.

Можно еще поставить туда прокси/VPN, если юрисдикция хостера не совпадает с юрисдикцией домашней машины, но мы пока этот вопрос рассматривать не будем. На худой конец можно ssh -D использовать.

В принципе, прикрутить ко всему этому хозяйству простенькую web-панель в стиле LuCI, чтобы можно было просто галочками по списку включать-выключать все сервисы, не так уж и сложно.

Для решения перечисленных задач нужно

  1. dovecot (в дистрибутиве)
  2. postfix (в дистрибутиве)
  3. ciderwebmail (по-моему в Debian еще не попала версия, которую я год назад патчил на предмет русских имен папок )
  4. matrix-synapse (надо брать из бэкпортов, там он заметно новее)
  5. element-web (в дистрибутиве нет, но есть отдельный репозиторий с пакетами
  6. coturn (в дистрибутиве)
  7. radicale (в дистрибутиве)
  8. Какой-нибудь web-сервер чтобы все вышеперчисленные интерфейсы проксировать. nginx сойдет, но apache лучше (оба в дистрибутиве)
  9. acme-tiny (в дистрибутиве)
  10. bind9 (в дистрибутиве.)

Остальное надо писать, но его довольно немного. В основном скрипты для администрирования. Учитывая что почти у всех сервисов которые нам нужны, свои заморочки насчет хранения паролей. Насчет галерей и CMS я просто не очень в курсе что нынче бывает, и как его задеплоить так, чтобы не бояться взлома при отсутствии квалифицированного администрирования.

Деплоймент этой штуки выглядит так:

  1. Регистрируем домен.
  2. Покупаем VPS-ку
  3. Накатываем на VPS-ку образ системы (лично я всегда rsync-ом обходился, но возможны варианты вроде загрузочного ISO-образа)
  4. Заходим в эту VPS-ку по HTTP. Указываем домен и IP-адрес выданный хостером. Жмем кнопку "обновить сертификаты"
  5. Заходим туда по HTTPS, меняем пароли, загружаем ssh-ключи и проверяем соответветсвие списка включенных сервисов требуемому.
  6. Правим в настройках DNS регистратора адрес первичного DNS, указывая вот на этот сервер, и настраиваем вторичный DNS.
  7. Пинаем хостера чтобы разрешил слать и принимать почту с этой VPS-ки

Вместо п 2 и 3 можно поставить raspberry pi, и на нее накатить аналогичный образ. Правда перспективы запинывания домашнего провайдера, чтобы разрешил слать/получать почту мне кажутся несколько менее радужными. Зато порыться в вашем почтовом ящике без вашего ведома ни одна спецслужба не сможет - они будут вынуждены прийти к вам домой и предъявить ордер на обыск.

X-Post to LJ

vitus_wagner: My photo 2005 (Default)

Когда-то давно была хорошая программа OffroadOSM - десктопная версия OSMAnd.

Потом она как-то перестала работать, потому что некоторые используемые API в новых версияхз java исчезли. А новых релизов что-то не видать. Но вот порывшись на форумах этой программы, нашел версию которая с 17-й java работает.

Надеюсь до выхода forky этого мне хватит. В trixie вроде 17 java еще есть.

vitus_wagner: My photo 2005 (Default)

Совершенно случайно обратил внимание на сообщения:

gpg: создан каталог '/home/v.wagner/.gnupg'
gpg: создан щит с ключами '/home/v.wagner/.gnupg/pubring.kbx'

Какая образная метафора "щит с ключами"! Так и представляешь себе вахтера на проходной какого-нибудь почтового ящика, у которого за спиной висит щит с ключами от всех лабораторий, и он их сотрудникам по утрам выдает по предъявлению пропуска (passphrase) а по вечерам следит, чтобы сдать не забыли.

vitus_wagner: My photo 2005 (Default)

В Debian 12 блютусный менеджер повадился открывать отдельные окна с сообщением "такое-то устройство connected", такое-то устройство "disconnected".

Причем в этих окнах нет кнопки "Ок", закрывать надо кликая на крестик в уголку окна. И возникает это окно почему-то в центре того дисплея, на котором случайно оказался курсор.

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

Поэтому у меня стали эти мелкие окна копиться. И наконец мне это надоело. Пришлось немножко погуглить, потом поставить пакет wmctrl и написать вот такое:

wmctrl -l -x|awk '$3 ~ "blueman-applet" {print $1;}'|xargs -n1 wmctrl -ic

Окна мы выбираем по классу blueman-applet, потому что заголовок у них - имя bluetooth-устройства, то есть у разных мышей и наушников - разный. Но никаких других окон с таким классом blueman-applet не создает. Если открыть окно настроек, у него будет класс blueman-manager. Так что окна эти можно прибивать не глядя. Что и делает последняя команда в pipeline.

Сначала я хотел решить эту проблему только базовыми средствами X. Выбрать нужные окна я вполне могу по xprop. Но чтобы послать окну сообщение WM_CLOSE, надо уже что-то не входящее в пакет x11-utils. В нем есть только xkill, который пришибает не окно, а процесс его создавший (что мне совершенно не надо). А если ставить что-то что умеет закрывать окна из командной строки, то почему бы не wmctrl, который и поиск окон существенно упростит?

Почему бы не воспользоваться командой

 wmctrl -xc blueman-applet.Blueman-applet

А потому что она закрывает не все окна с данным классом, а только одно, первое попавшееся. Можно конечно ее в цикл обернуть:

 while wmctrl -xc blueman-applet.Blueman-applet; do :; done

Благо wmctrl возвращает ненулевой код завершения если не нашел окна которому нужно сказать close.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

January 2026

S M T W T F S
     1 23
45678910
11121314151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 3rd, 2026 04:16 pm
Powered by Dreamwidth Studios