💾 Archived View for causa-arcana.com › blog › 2021 › 11 › 10 › server-administration.html captured on 2022-07-16 at 13:48:14.
⬅️ Previous capture (2022-04-29)
-=-=-=-=-=-=-
<!DOCTYPE html> <html class="h-100" lang="ru"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, shrink-to-fit=no, user-scalable=no"/> <title>Основы настройки и администрирования сервера с ОС Ubuntu 20.04 LTS | Causa Arcana</title> <link rel="canonical" href="https://causa-arcana.com/blog/2021/11/10/server-administration.html"/> <link rel="alternate" type="application/rss+xml" title="Causa Arcana" href="https://causa-arcana.com/blog/feed.xml"/> <meta name="description" content="Мы иногда публикуем инструкции по настройке различного серверного ПО, что, как нетрудно догадаться, требует настройки и администрирования сервера. Это нетривиальная задача. Неправильная настройка сервера может поставить под угрозу стабильность и б..."/> <meta name="twitter:card" content="summary"/> <meta name="twitter:site" content="@causa_arcana"/> <meta name="twitter:creator" content="@causa_arcana"/> <meta name="twitter:title" content="Основы настройки и администрирования сервера с ОС Ubuntu 20.04 LTS | Causa Arcana"/> <meta name="twitter:description" content="Мы иногда публикуем инструкции по настройке различного серверного ПО, что, как нетрудно догадаться, требует настройки и администрирования сервера. Это нетривиальная задача. Неправильная настройка сервера может поставить под угрозу стабильность и б..."/> <meta name="twitter:image" content="https://causa-arcana.com/assets/images/blog/preview/ubuntu-cloud.png"/> <meta property="og:type" content="website"/> <meta property="og:url" content="https://causa-arcana.com/blog/2021/11/10/server-administration.html"/> <meta property="og:title" content="Основы настройки и администрирования сервера с ОС Ubuntu 20.04 LTS | Causa Arcana"/> <meta property="og:description" content="Мы иногда публикуем инструкции по настройке различного серверного ПО, что, как нетрудно догадаться, требует настройки и администрирования сервера. Это нетривиальная задача. Неправильная настройка сервера может поставить под угрозу стабильность и б..."/> <meta property="og:image" content="https://causa-arcana.com/assets/images/blog/preview/ubuntu-cloud.png"/> <link href="../../../../assets/images/logo-small.jpg" rel="icon" type="image/jpg" /> <link href="../../../../assets/stylesheets/site.css" rel="stylesheet" /> </head> <body class="d-flex flex-column h-100"> <header> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container-fluid"> <a href="../../../../index.html" class="navbar-brand"> <img src="../../../../assets/images/logo-small.jpg" width="30" height="30" alt="Логотип" /> Causa Arcana </a> <div class="navbar-collapse"> <ul class="navbar-nav me-auto"> <li class="nav-item"> <a href="../../../feed.html" class="nav-link active "> Блог </a> </li> <li class="nav-item"> <a href="../../../../sources.html" class="nav-link "> Источники </a> </li> <li class="nav-item"> <a href="../../../../git.html" class="nav-link "> Git </a> </li> <li class="nav-item"> <a href="../../../../team/index.html" class="nav-link "> Наша команда </a> </li> </ul> </div> </div> </nav> </header> <main> <article class="cl-blog-article container mt-4 mb-5"> <header> <h1>Основы настройки и администрирования сервера с ОС Ubuntu 20.04 LTS</h1> <p> <small class="text-muted"> <time datetime="2021-11-10T08:30:00Z"> 10 Ноябрь, 2021 08:30 </time> </small> • <small class="text-muted"> OfShad0ws </small> <br/> <span class="badge bg-secondary me-2"> руководства </span> <span class="badge bg-secondary me-2"> информационная безопасность </span> <span class="badge bg-secondary me-2"> технологии </span> </p> </header> <div class="blog-article--main mt-5 text-break"> <p>Мы иногда публикуем инструкции по настройке различного серверного ПО, что, как нетрудно догадаться, требует настройки и администрирования сервера. Это нетривиальная задача. Неправильная настройка сервера может поставить под угрозу стабильность и безопасность. Поэтому мы решили обобщить основную информацию по этой теме в данной статье, чтобы в дальнейшем ссылаться на неё. Если ранее вы уже настраивали сервер по нашим статьям, например, для <a href="../../07/07/tor-yggdrasil.html">Tor и Yggdrasil</a> или <a href="../../09/14/wireguard.html">WireGuard</a>, то мы рекомендуем проверить его состояние по данной статье.</p> <p>Мы будем использовать ОС Ubuntu Server 20.04 LTS (Focal Fossa), как одну из наиболее популярных, стабильных и доступных, однако инструкции применимы почти без изменений к любой ОС на основе Debian GNU/Linux. Сервер мы будем арендовать на <a href="https://m.do.co/c/329082d7d543">DigitalOcean</a> (партнёрская ссылка). Вы можете выбрать любого другого поставщика, их возможности в основном идентичны.</p> <h2>Создание сервера и подключение к нему</h2> <h3>Создание ключа SSH</h3> <p>При аренде сервера подключиться к нему обычно можно двумя способами: через веб-консоль или по SSH. Веб-консоль не слишком удобна, поэтому пользуйтесь ей только в крайних случаях, например, если из-за изменения настроек SSH не работает. Мы будем использовать стандартный клиент SSH, который установлен в большинстве систем GNU/Linux. Если вы пользуетесь другой ОС на настольном компьютере, то найдите подходящий вам клиент SSH самостоятельно. В SSH возможно использование пароля или ключа. Ключ гораздо безопаснее, поэтому мы сразу создадим его. Для этого введите следующую команду:</p> <pre><code>$ ssh-keygen </code></pre> <p>По умолчанию будет предложено сохранить секретный ключ в файле <code>~/.ssh/id_rsa</code>. Примите это предложение. Далее будет запрошена ключевая фраза, которой будет защищён ключ. При её использовании в случае похищения ключа злоумышленнику потребуется время, чтобы его взломать. При достаточной длине ключевой фразы это время может превосходить срок, за который вы замените ключ. Публичный ключ будет сохранён в файле <code>~/.ssh/id_rsa.pub</code> – именно этот ключ нужно передать сервису. Чтобы увидеть содержимое этого файла, введите следующую команду:</p> <pre><code>$ cat ~/.ssh/id_rsa.pub </code></pre> <h3>Создание сервера</h3> <p>Теперь создадим сервер. В DigitalOcean для этого нужно нажать кнопку “<em>Create</em>”, затем “<em>Droplets</em>”. На появившейся странице настройте опции:</p> <ul> <li>“<em>Choose an image</em>”: “<em>Distributions</em>”, “<em>Ubuntu</em>”, “<em>20.04 (LTS) x64</em>”</li> <li>“<em>Choose a plan</em>”: выбирайте в зависимости от ваших потребностей. Самый дешёвый сервер стоит $5 в месяц.</li> <li>“<em>Choose a datacenter region</em>”: разумным решением будет выбрать наиболее географически близкий к вам или к вашим клиентам центр обработки данных, но могут быть и другие критерии, например вам могут быть важны законы страны, в которой будет находиться сервер.</li> <li>“<em>Select additional options</em>”: по необходимости включите IPv6 и мониторинг.</li> </ul> <p>В разделе “<em>Authentication</em>” выберите “<em>SSH keys</em>”. Если вы ещё не добавляли ваш ключ SSH, то нажмите кнопку “<em>New SSH key</em>” и добавьте ключ, который вы создали ранее, из файла <code>~/.ssh/id_rsa.pub</code>. Имя хоста (пункт “<em>Choose a hostname</em>”) можно оставить предложенное. Если у сервера будет доменное имя, то имеет смысл указать его здесь.</p> <div class="d-flex justify-content-center"> <figure class="nice-figure"> <img src="../../../../assets/images/blog/digitalocean-droplet-ssh.png" alt="Выбор ключа SSH при создании сервера."/> <figcaption> Выбор ключа SSH при создании сервера. </figcaption> </figure> </div> <h3>Резервное копирование</h3> <p>Настройка и обновление системы в случае ошибок или прерывания связи с сервером могут привести к его неработоспособности. Мы рекомендуем перед каждой потенциально опасной операцией и перед большим обновлением системы создавать снимок сервера. Также можно включить автоматическое резервное копирование. В DigitalOcean это возможно при создании сервера или позже в его настройках. При создании выберите опцию “<em>Enable backups</em>”.</p> <div class="row"> <div class="col-lg-6"> <figure class="nice-figure"> <img src="../../../../assets/images/blog/digitalocean-droplet-finalize.png" alt="Включение резервного копирования при создании сервера."/> <figcaption> Включение резервного копирования при создании сервера. </figcaption> </figure> </div> <div class="col-lg-6"> <figure class="nice-figure"> <img src="../../../../assets/images/blog/digitalocean-droplet-snapshots.png" alt="Создание снимка сервера."/> <figcaption> Создание снимка сервера. </figcaption> </figure> </div> </div> <h2>Создание основного пользователя</h2> <p>По умолчанию доступ предоставляется к пользователю <code>root</code>, однако это небезопасно. Вместо этого мы создадим отдельного пользователя (в примере – <code>username</code>), который сможет выполнять команды с правами суперпользователя благодаря команде <code>sudo</code>. Для этого его нужно будет добавить в группу <code>sudo</code> (в некоторых системах вместо этого используется группа <code>wheel</code>).</p> <pre><code># adduser username # usermod -a -G sudo username </code></pre> <p>Настроим для нового пользователя аутентификацию по ключу SSH. Для начала необходимо авторизоваться под его именем. Для включения аутентификации по ключу SSH необходимо скопировать содержимое локального файла <code>~/.ssh/id_rsa.pub</code> на виртуальный сервер в файл <code>~/.ssh/authorized_keys</code>. Этот файл и папку нужно создать с корректными правами доступа – только для текущего пользователя. Замените <code><YOUR SSH PUBLIC KEY></code> на строку с вашим ключом:</p> <pre><code># su username $ mkdir -m 700 ~/.ssh $ echo '<YOUR SSH PUBLIC KEY>' >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys </code></pre> <p>Отключитесь от сервера (<strong>Ctrl + D</strong> для выхода из сессии пользователя и ещё раз для отключения) и проверьте возможность входа от имени пользователя без указания пароля (замените <code>46.101.128.1</code> на IP-адрес вашего сервера):</p> <pre><code>$ ssh username@46.101.128.1 </code></pre> <h2>Редактирование файлов</h2> <p>Для создания и редактирования конфигурационных файлов необходимо владеть навыками работы в консольном текстовом редакторе. Можно использовать Vim или Emacs, но они требуют изучения. Самым простым вариантом для новичков будет Nano, который устанавливается следующей командой:</p> <pre><code>$ sudo apt install nano </code></pre> <p>Nano с правами суперпользователя вызывается командой <code>sudo nano</code>. Можно дополнительно передать имя файла: <code>sudo nano /foo/bar.txt</code>. Далее можно разобраться по подсказкам в нижней части экрана. Они означают сочетания клавиши <strong>Ctrl</strong> с другими клавишами. Приведём часто используемые сочетания:</p> <ul> <li><strong>Ctrl + S</strong> – сохранить документ</li> <li><strong>Ctrl + X</strong> – выйти из редактора</li> <li><strong>Ctrl + W</strong> – найти текст</li> </ul> <div class="d-flex justify-content-center"> <figure class="nice-figure"> <img src="../../../../assets/images/blog/nano.png" alt="Текстовый редактор Nano."/> <figcaption> Текстовый редактор Nano. </figcaption> </figure> </div> <h2>Обновление системы</h2> <p>Как и в любой другой операционной системе, в GNU/Linux могут находить и исправлять уязвимости, поэтому необходимо регулярно устанавливать все доступные обновления. Следующие команды получают с сервера обновлений актуальные версии пакетов, а затем загружают и устанавливают их.</p> <pre><code>$ sudo apt update $ sudo apt upgrade </code></pre> <p>При этом ядро Linux не обновляется, новая версия устанавливается рядом с текущей. Чтобы удалять неиспользуемые версии ядра Linux, вы можете воспользоваться командой <code>sudo apt autoremove --purge</code>. Эта команда также удалит те пакеты, которые были установлены автоматически и не требуются для работы ни одному из других пакетов в системе. При обновлении пакетов сервисы перезапускаются автоматически, а при обновлении ядра требуется перезагрузка системы:</p> <pre><code>$ sudo reboot </code></pre> <h2>Безопасность SSH</h2> <h3>Конфигурация</h3> <p>Конфигурация сервера SSH находится в файле <code>/etc/ssh/sshd_config</code>. Необходимо изменить некоторые строки. Здесь изменяемые опции представлены в алфавитном порядке. В файле конфигурации они могут быть в другом порядке, но все они там присутствуют, добавлять строки не нужно. Если строка закомментирована, то есть начинается с символа решётки (<code>#</code>), то этот символ необходимо удалить.</p> <pre><code>AllowAgentForwarding no AllowTcpForwarding no ChallengeResponseAuthentication no PasswordAuthentication no PermitRootLogin no PermitUserEnvironment no UseDNS no X11Forwarding no </code></pre> <p>После изменения конфигурации перезапустите сервис:</p> <pre><code>$ sudo systemctl restart sshd </code></pre> <h3>Смена порта SSH</h3> <p>По умолчанию SSH использует порт 22. Вредоносное ПО и злоумышленники будут подключаться к этому порту вашего сервера в попытках получить доступ. Сделаем эту задачу сложнее и сменим порт, на котором работает SSH. Для начала выберите любой порт с номером от 1025 до 49150. Постарайтесь выбрать порт, который не <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2_TCP_%D0%B8_UDP">используется в сети</a>, поскольку эти порты тоже будут уязвимы.</p> <p>Некоторые поставщики виртуальных серверов могут по умолчанию включать сетевой экран в своей сети и закрывать доступ ко всем портам сервера, кроме 22-го. Перед выполнением дальнейших инструкций в этом разделе убедитесь, что такой сетевой экран выключен в интерфейсе поставщика или отсутствует, либо разрешите в его настройках дополнительный порт.</p> <p>В файле <code>/etc/ssh/sshd_config</code> отредактируйте строку <code>#Port 22</code>, изменив значение и убрав символ комментария, например: <code>Port 48428</code>. Перезапустите сервис:</p> <pre><code>$ sudo systemctl restart sshd </code></pre> <p>С этого момента при подключении к серверу необходимо будет указывать порт:</p> <pre><code>$ ssh -p 48428 username@46.101.128.1 </code></pre> <h3>Сетевой экран</h3> <p>Сетевой экран используется для контроля подключений к серверу. С его помощью мы можем определять, с каких адресов к каким портам сервера подключения разрешены. Установим UFW и сразу разрешим доступ к порту сервера SSH, чтобы не запретить доступ себе, затем включим сетевой экран:</p> <pre><code>$ sudo apt install ufw $ sudo ufw default allow outgoing $ sudo ufw allow in 48428/tcp # замените на ваш порт SSH $ sudo ufw default deny incoming $ sudo ufw enable </code></pre> <p>Текущие правила можно посмотреть командой <code>sudo ufw status verbose</code>. По умолчанию UFW пишет информацию о соединениях в журнал. Эту опцию можно отключить командой <code>sudo ufw logging off</code>.</p> <h3>Fail2Ban</h3> <p>Fail2Ban – ПО для защиты от атак с подбором пароля. После нескольких неудачных попыток авторизации по SSH Fail2Ban заблокирует попытки подключения с подозрительного IP-адреса на некоторое время. Настройка не требуется, достаточно установить:</p> <pre><code>$ sudo apt install fail2ban </code></pre> <p>Fail2Ban не конфликтует с сетевым экраном UFW. Для выявления подозрительной активности он читает системные журналы. Его можно использовать для выявления атак не только на SSH, но на любой другой сервис.</p> <h3>Port knocking для входа по SSH</h3> <p>Ещё более надёжным решением можем быть port knocking. Это способ защиты от сканирования портов с целью поиска порта SSH. При использовании port knocking порт SSH по умолчанию закрыт с помощью сетевого экрана и открывается только на короткое время после получения правильной последовательности сетевых пакетов. Установим <code>knockd</code> на сервер и на локальное устройство:</p> <pre><code>$ sudo apt install knockd </code></pre> <p>Замените содержимое файла <code>/etc/knockd.conf</code> на сервере на следующие настройки, но вместо портов 2222, 3333, 4444 укажите другие номера, не следующие друг за другом в порядке возрастания или убывания, а вместо порта 48428 укажите порт, используемый для SSH.</p> <pre><code>[options] UseSyslog [opencloseSSH] sequence = 2222:udp,3333:udp,4444:udp seq_timeout = 15 tcpflags = syn,ack start_command = ufw allow from %IP% to any port 48428 cmd_timeout = 5 stop_command = ufw delete allow from %IP% to any port 48428 </code></pre> <p>Включите сервис и удалите правила, разрешающие подключения к порту SSH с любого IP-адреса:</p> <pre><code>$ sudo systemctl enable --now knockd $ sudo ufw delete allow 48428/tcp </code></pre> <p>Отключитесь от сервера. Следующее подключение будет возможно после отправки правильной последовательности пакетов:</p> <pre><code>$ knock 46.101.128.1 2222:udp 3333:udp 4444:udp $ ssh -p 48428 username@46.101.128.1 </code></pre> <h2>Некоторые полезные изменения</h2> <h3>Ограничение размера журналов</h3> <p>При высокой активности сервера или при наличии ошибок системные журналы могут занимать много места на диске. Чтобы избежать ситуации, при которой свободное место закончится и сервер станет недоступен, можно ограничить максимальный размер журналов. Внесите изменения в файл <code>/etc/systemd/journald.conf</code>: удалите символ комментария в строке <code>#SystemMaxUse=</code> и установите значение, например: <code>SystemMaxUse=50M</code>.</p> <p>Для немедленной очистки журналов (например, старше 1 дня) используйте следующие команды:</p> <pre><code>$ sudo journalctl --rotate $ sudo journalctl --vacuum-time=1d </code></pre> <h3>Удаление Snap</h3> <p>В Ubuntu по умолчанию установлен менеджер пакетов Snap. Если вы не планируете его использовать, менеджер можно удалить, освободив некоторое количество оперативной памяти и избавив систему от фонового процесса:</p> <pre><code>$ sudo apt purge snapd </code></pre> <h2>Бесплатные сертификаты TLS от Let’s Encrypt</h2> <p>Если у вашего сервера будет доменное имя, то некоторые протоколы могут шифровать соединения с помощью TLS. В первую очередь это относится к протоколу HTTPS, но сертификат может использоваться и в других протоколах. Обычно использование сертфиката является платным, однако проект Let’s Encrypt предоставляет бесплатные сертификаты. Для автоматической настройки сертификата используется утилита <a href="https://certbot.eff.org">Certbot</a>:</p> <pre><code>$ sudo apt install certbot </code></pre> <p>Настройки утилиты находятся в файле <code>/etc/letsencrypt/cli.ini</code>. Используйте следующую конфигурацию, заменив доменное имя <code>example.com</code> и адрес электронной почты <code>username@example.com</code> на ваши:</p> <pre><code>agree-tos = true cert-name = example.com domains = example.com email = username@example.com max-log-backups = 0 no-eff-email = true non-interactive = true redirect = true rsa-key-size = 4096 standalone = true </code></pre> <p>Откройте порт 80 в сетевом экране и запустите Certbot:</p> <pre><code>$ sudo ufw allow in 80/tcp $ sudo certbot certonly </code></pre> <p>Для обновления сертификата используйте команду <code>sudo certbot renew</code>. Выполнять её можно автоматически с помощью задачи Cron. Если на порту 80 работает веб-сервер, например, Nginx, то при запуске этой команды его нужно останавливать. Это можно автоматизировать добавлением в конфигурационный файл следующих строк:</p> <pre><code>pre-hook = sudo systemctl stop nginx.service post-hook = sudo systemctl start nginx.service </code></pre> <p>Читать файл приватного ключа сертификата может только пользователь <code>root</code>. Чтобы читать такие файлы, сервера приложений, такие как Nginx, запускаются изначально под этим пользователем, а потом сбрасывают привилегии. Однако некоторые приложения не умеют так делать. Чтобы дать другому пользователю (в примере <code>sysusername</code>) возможность читать этот файл, используйте Access Control Lists:</p> <pre><code>$ sudo apt install acl $ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/live $ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/live/example.com $ sudo setfacl -m u:sysusername:r /etc/letsencrypt/live/example.com/fullchain.pem $ sudo setfacl -m u:sysusername:r /etc/letsencrypt/live/example.com/privkey.pem $ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/archive $ sudo setfacl -m u:sysusername:r-X /etc/letsencrypt/archive/example.com $ sudo setfacl -m u:sysusername:r /etc/letsencrypt/archive/example.com/fullchain1.pem $ sudo setfacl -m u:sysusername:r /etc/letsencrypt/archive/example.com/privkey1.pem </code></pre> <p>При обновлении сертификата нужно повторить эту операцию для новых файлов в директории <code>/etc/letsencrypt/archive</code>, например <code>fullchain2.pem</code> и <code>privkey1.pem</code>.</p> </div> </article> </main> <footer class="mt-auto py-4 bg-dark text-light"> <div class="container"> <div class="d-sm-none"> <div class="row row-cols-1"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <div class="d-none d-sm-block d-md-none"> <div class="row row-cols-2"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <div class="d-none d-md-block d-lg-none"> <div class="row row-cols-3"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <div class="d-none d-lg-block"> <div class="row row-cols-4"> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://t.me/causa_arcana" class="link-light"><i class="fab fa-telegram"></i> Канал в Telegram</a></li> <li><a href="https://t.me/causa_arcana_chat" class="link-light"><i class="fab fa-telegram"></i> Чат в Telegram</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://www.youtube.com/c/CausaArcana" class="link-light"><i class="fab fa-youtube"></i> YouTube</a></li> <li><a href="https://medium.com/causa-arcana" class="link-light"><i class="fab fa-medium"></i> Medium</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://qoto.org/@causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> Mastodon</a></li> <li><a href="https://diode.zone/video-channels/causa_arcana" class="link-light"><i class="fab fa-mastodon"></i> PeerTube</a></li> </ul> </div> <div class="col"> <ul class="list-unstyled mb-0"> <li><a href="https://matrix.to/#/#causa-arcana:matrix.org" class="link-light"><i class="far fa-comments"></i> Matrix</a></li> <li><a href="https://twitter.com/causa_arcana" class="link-light"><i class="fab fa-twitter"></i> Twitter</a></li> </ul> </div> </div> </div> <hr/> <div class="row"> <div class="col-12 col-lg-9"> <p class="mb-0"> <i class="fas fa-rss-square"></i> RSS: <a href="https://causa-arcana.com/blog/feed.xml" class="text-reset">https://causa-arcana.com/blog/feed.xml</a> </p> <p class="mb-0"> <i class="fab fa-creative-commons-by"></i> Содержимое доступно на условиях лицензии <a rel="license" href="https://creativecommons.org/licenses/by/4.0/" class="text-reset">Creative Commons Attribution</a>. </p> <p class="mb-0"> <i class="far fa-envelope"></i> Связь с администрацией: <a href="mailto:admin@causa-arcana.com" class="text-reset"> admin@causa-arcana.com </a> </p> </div> <div class="col-12 col-lg-3"> <hr class="d-block d-lg-none"/> <img src="../../../../assets/images/badge-ipv6.svg" height="24" class="me-2" alt="IPv6" /> <a href="https://no-js.club" target="_blank" class="me-2"> <img src="../../../../assets/images/badge-no-js-club.svg" height="24" alt="no-JS Club" /> </a> <a href="https://1mb.club" target="_blank" class="me-2 link-light"> <span>[1MB Club]</span> </a> </div> </div> </div> </footer> </body> </html>