💾 Archived View for causa-arcana.com › blog › 2021 › 11 › 10 › server-administration.html captured on 2022-07-16 at 13:48:14.

View Raw

More Information

⬅️ Previous capture (2022-04-29)

🚧 View Differences

-=-=-=-=-=-=-

<!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>

&bull;

<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> &ndash; именно этот ключ нужно передать сервису.
Чтобы увидеть содержимое этого файла, введите следующую команду:</p>

<pre><code>$ cat ~/.ssh/id_rsa.pub
</code></pre>

<h3>Создание сервера</h3>

<p>Теперь создадим сервер. В DigitalOcean для этого нужно нажать кнопку &ldquo;<em>Create</em>&rdquo;,
затем &ldquo;<em>Droplets</em>&rdquo;. На появившейся странице настройте опции:</p>

<ul>
<li>&ldquo;<em>Choose an image</em>&rdquo;: &ldquo;<em>Distributions</em>&rdquo;, &ldquo;<em>Ubuntu</em>&rdquo;, &ldquo;<em>20.04 (LTS) x64</em>&rdquo;</li>
<li>&ldquo;<em>Choose a plan</em>&rdquo;: выбирайте в зависимости от ваших потребностей. Самый
дешёвый сервер стоит $5 в месяц.</li>
<li>&ldquo;<em>Choose a datacenter region</em>&rdquo;: разумным решением будет выбрать наиболее
географически близкий к вам или к вашим клиентам центр обработки данных, но
могут быть и другие критерии, например вам могут быть важны законы страны, в
которой будет находиться сервер.</li>
<li>&ldquo;<em>Select additional options</em>&rdquo;: по необходимости включите IPv6 и мониторинг.</li>
</ul>

<p>В разделе &ldquo;<em>Authentication</em>&rdquo; выберите &ldquo;<em>SSH keys</em>&rdquo;. Если вы ещё не добавляли ваш
ключ SSH, то нажмите кнопку &ldquo;<em>New SSH key</em>&rdquo; и добавьте ключ, который вы создали
ранее, из файла <code>~/.ssh/id_rsa.pub</code>. Имя хоста (пункт &ldquo;<em>Choose a hostname</em>&rdquo;)
можно оставить предложенное. Если у сервера будет доменное имя, то имеет смысл
указать его здесь.</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 это возможно при создании сервера или позже в его настройках. При
создании выберите опцию &ldquo;<em>Enable backups</em>&rdquo;.</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>, однако это
небезопасно. Вместо этого мы создадим отдельного пользователя (в примере &ndash;
<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>. Этот файл и папку нужно
создать с корректными правами доступа &ndash; только для текущего пользователя.
Замените <code>&lt;YOUR SSH PUBLIC KEY&gt;</code> на строку с вашим ключом:</p>

<pre><code># su username
$ mkdir -m 700 ~/.ssh
$ echo &#39;&lt;YOUR SSH PUBLIC KEY&gt;&#39; &gt;&gt; ~/.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> &ndash; сохранить документ</li>
<li><strong>Ctrl + X</strong> &ndash; выйти из редактора</li>
<li><strong>Ctrl + W</strong> &ndash; найти текст</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 &ndash; ПО для защиты от атак с подбором пароля. После нескольких неудачных
попыток авторизации по 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&rsquo;s Encrypt</h2>

<p>Если у вашего сервера будет доменное имя, то некоторые протоколы могут шифровать
соединения с помощью TLS. В первую очередь это относится к протоколу HTTPS, но
сертификат может использоваться и в других протоколах. Обычно использование
сертфиката является платным, однако проект Let&rsquo;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&nbsp;Club]</span>
</a>    </div>
  </div>
</div>

    </footer>
  </body>
</html>