Linux — простыми словами

Linux — это операционная система, подобно Windows и macOS, но с несколькими ключевыми отличиями. Вот несколько основных моментов, объясненных простыми словами:

  1. Открытый исходный код: В отличие от Windows и macOS, исходный код Linux доступен всем. Это означает, что любой желающий может изучить, как устроена система, изменить ее под свои нужды или даже создать собственную версию.
  2. Бесплатность: Большинство дистрибутивов Linux распространяются бесплатно. Вы можете скачать, установить и использовать их без оплаты лицензионных сборов.
  3. Дистрибутивы: Существует множество «версий» Linux, называемых дистрибутивами. Каждый из них предлагает разный набор программ, интерфейс и поддержку. Например, Ubuntu, Fedora и Debian — популярные дистрибутивы, подходящие как для новичков, так и для опытных пользователей.
  4. Гибкость и настраиваемость: Linux позволяет пользователю контролировать почти все аспекты системы. Это означает, что вы можете настроить свою систему точно под свои нужды, от внешнего вида рабочего стола до того, какие программы будут установлены.
  5. Командная строка: В Linux большой акцент делается на использование командной строки, мощного инструмента для управления системой и программами. Хотя это может показаться сложным для новичков, освоение командной строки открывает широкие возможности для управления компьютером.
  6. Безопасность: Linux известен своей высокой безопасностью. Благодаря своей архитектуре и активному сообществу, которое быстро реагирует на обнаружение уязвимостей, системы на базе Linux считаются одними из самых безопасных.
  7. Сообщество: У Linux есть большое и активное сообщество пользователей и разработчиков по всему миру. Это означает, что вы можете легко найти помощь, руководства и поддержку на различных форумах и веб-сайтах.

Linux идеально подходит для разработчиков, системных администраторов и тех, кто хочет полностью контролировать свою компьютерную среду. Он также подходит для образовательных учреждений, серверов, встраиваемых систем и даже для домашних пользователей, желающих избежать лицензионных сборов или искать альтернативу коммерческим операционным системам.

Если есть вопросы задавайте их в комментариях. Понравилась статья? Расскажите о ней друзьям в социальных сетях.

Настраиваем мониторинг с Prometheus. Часть 1. Знакомство и установка.

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

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

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

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

Prometheus — это платформа для мониторинга и alerting’а, которая позволяет собирать, обрабатывать и визуализировать данные в режиме реального времени. Она предоставляет инструменты для создания и управления наборами данных, а также для создания оповещений и уведомлений на основе определенных критериев.

Архитектура Prometheus

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

Prometheus — центральное звено, где хранятся все собранные метрики и имеется веб-интерфейс для их просмотра. Она собирает данные из различных источников, обрабатывает их и сохраняет на сервере. Prometheus также имеет веб-интерфейс, который позволяет пользователям просматривать собранные данные в реальном времени.

Node Exporter — агенты, собирающие метрики с целевых машин и передающие их на сервер Prometheus. Они могут быть настроены для сбора различных типов данных, таких как загрузка процессора, использование памяти и другие метрики производительности. Экспортеры устанавливаются на целевые машины и отправляют данные на сервер Prometheus через HTTP.

AlertManager —  уведомляет о возникших проблемах, обрабатывает оповещения и отправляет их на определенные адреса. Он поддерживает различные способы отправки уведомлений, такие как электронная почта, Slack, HipChat и PagerDuty. Также возможно настроить отправку оповещений через Telegram и другие сервисы.

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

Установка

Prometheus можно установить тремя способами: через менеджер пакетов, путем загрузки и установки готовых двоичных файлов с официального сайта, или развернув все компоненты в контейнере Docker. Установка через менеджер пакетов упрощает процесс обновления, но может привести к устареванию версии Prometheus. Ручная установка позволяет использовать последнюю версию Prometheus, но требует больше усилий для обновления. Развертывание в Docker-контейнере обеспечивает гибкость и контроль, но также требует более глубоких знаний о Docker и Prometheus.

Установка вручную

Prometheus можно установить вручную на различные дистрибутивы Linux, такие как Ubuntu, Debian, CentOS и Arch. Этот процесс включает в себя загрузку и установку бинарных файлов с официального сайта Prometheus, настройку компонентов Prometheus и запуск сервера Prometheus. Этот метод установки позволяет использовать последнюю версию Prometheus и обеспечивает гибкость в настройке и управлении Prometheus.

Установка Prometheus

Чтобы установить Prometheus вручную, необходимо выполнить следующее. Перейдите на страницу релизов Prometheus на GitHub (https://github.com/prometheus/prometheus/releases) и скачайте бинарный файл для своей платформы.

$ wget https://github.com/.../prometheus-2.45.3.linux-amd64.tar.gz
$ tar xf prometheus-*.tar.gz

Раскидываем файлы по файловой системе и заводим пользователя:

# cd prometheus-*
# cp prometheus promtool /usr/local/bin
# mkdir /etc/prometheus /var/lib/prometheus
# cp prometheus.yml /etc/prometheus
# useradd --no-create-home --home-dir / --shell /bin/false prometheus
# chown -R prometheus:prometheus /var/lib/prometheus

В архиве будут два ненужных каталога: console_libraries/ и consoles/. Их не трогаем.

Создаём systemd-юнит: /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/usr/local/bin/prometheus \
  --config.file /etc/prometheus/prometheus.yml \
  --storage.tsdb.path /var/lib/prometheus/
ExecReload=/bin/kill -HUP $MAINPID
ProtectHome=true
ProtectSystem=full

[Install]
WantedBy=default.target

Запускаем Prometheus server:

# systemctl daemon-reload
# systemctl start prometheus
# systemctl status prometheus

В статусе должно быть написано “active (running)” — значит работает. Теперь можно сходить на http://localhost:9090 и полюбоваться на интерфейс Prometheus’а. Пока что он бесполезен, но уже можно потыкать.

prometheus server

Установка node exporter

Node exporter надо раскатать на всех машинах, которые вы хотите мониторить. Устанавливается он аналогично серверу. Берём последний билд с github.com/prometheus/node_exporter/releases.

$ wget https://github.com/.../node_exporter-0.18.1.linux-amd64.tar.gz
$ tar xf node_exporter-*.tar.gz
# cd node_exporter-*
# cp node_exporter /usr/local/bin
# useradd --no-create-home --home-dir / --shell /bin/false node_exporter

Создаём systemd-юнит: /etc/systemd/system/node_exporter.service

[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter

SyslogIdentifier=node_exporter
Restart=always

PrivateTmp=yes
ProtectHome=yes
NoNewPrivileges=yes

ProtectSystem=strict
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=yes

[Install]
WantedBy=multi-user.target

Важно! Если у вас /home вынесен на отдельный раздел, директиву ProtectHome=yes надо убрать, иначе node exporter будет неправильно показывать оставшееся место на разделе /home.

Запускаем node exporter:

# systemctl daemon-reload
# systemctl start node_exporter
# systemctl status node_exporter

Можно посмотреть как node exporter отдаёт метрики:

$ curl -s http://localhost:9100/metrics
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 7.9825e-05
go_gc_duration_seconds{quantile="0.25"} 7.9825e-05
go_gc_duration_seconds{quantile="0.5"} 7.9825e-05
go_gc_duration_seconds{quantile="0.75"} 7.9825e-05
go_gc_duration_seconds{quantile="1"} 7.9825e-05
go_gc_duration_seconds_sum 7.9825e-05
go_gc_duration_seconds_count 1
...

Пока не пытайтесь понять вывод. Отдаёт, и хорошо.

Установка alertmanager

Alertmanager — это про алерты. Первое время алертов у вас не будет, поэтому сейчас его можно не ставить. Но лучше всё-таки поставить, чтобы всё необходимое уже было подготовлено. Идём за дистрибутивом на github.com/prometheus/alertmanager/releases.

$ wget https://github.com/.../alertmanager-0.18.0.linux-amd64.tar.gz
$ tar xf alertmanager-*.tar.gz
# cd alertmanager-*
# cp alertmanager /usr/local/bin
# mkdir /etc/alertmanager /var/lib/alertmanager
# cp alertmanager.yml /etc/alertmanager
# useradd --no-create-home --home-dir / --shell /bin/false alertmanager
# chown -R alertmanager:alertmanager /var/lib/alertmanager

Создаём systemd-юнит: /etc/systemd/system/alertmanager.service

[Unit]
Description=Alertmanager for prometheus
After=network.target

[Service]
User=alertmanager
ExecStart=/usr/local/bin/alertmanager \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --storage.path=/var/lib/alertmanager/
ExecReload=/bin/kill -HUP $MAINPID

NoNewPrivileges=true
ProtectHome=true
ProtectSystem=full

[Install]
WantedBy=multi-user.target

Запускаем alertmanager:

# systemctl daemon-reload
# systemctl start alertmanager
# systemctl status alertmanager

В веб-интерфейсе Alertmanager доступны только базовые функции. Он работает на порту 9093 по адресу http://localhost:9093 и не предоставляет никаких дополнительных возможностей.

Установка Grafana

Если у вас Centos или Ubuntu, лучше установить Grafana из пакета. Это можно сделать используя репозитории ваших операционных систем или скачать на сайте grafana.com в разделе download.

$ wget https://dl.grafana.com/oss/release/grafana_6.3.2_amd64.deb
# dpkg -i grafana_6.3.2_amd64.deb

Запускаем grafana:

# systemctl start grafana
# systemctl status grafana

Prometheus, Node exporter, Alertmanager и Grafana слушают на всех сетевых интерфейсах по умолчанию. Это может сделать их уязвимыми для атак из интернета. Поэтому рекомендуется прикрыть их фаерволом от посторонних глаз.

Теперь, когда все необходимое установлено, нужно все компоненты подружить друг с другом. Для начала минимально настроим Prometheus:

Файл /etc/prometheus/prometheus.yml

global:
  scrape_interval:     15s
  evaluation_interval: 15s

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - localhost:9093

scrape_configs:
  - job_name: 'node'
    static_configs:
    - targets:
       - localhost:9100
     # - anotherhost:9100

Сейчас не буду углубляться в детали настройки, это оставим для следующих статей. На данный момент нам нужно получить хотя бы базовый, но работающий функционал мониторинга. Самое важное, что нужно знать на текущий момент:

  • Отступы в файле prometheus.yml должны быть сделаны с помощью двух пробелов, а не переносов строк. Это важно для корректной работы Prometheus.
  • Параметр scrape_interval в конфигурационном файле Prometheus указывает, как часто Prometheus будет опрашивать экспортеры на предмет новых данных.
  • Alertmanager слушает localhost:9093, node exporter слушает localhost:9100. IP-адрес alertmanager и Node exporter должны быть заменены на соответствующие IP-адреса ваших серверов. Если у вас установлен Node exporter на нескольких серверах, вы должны указать все их IP-адреса в конфигурационном файле.

После изменения конфигурационного файла prometheus.yml, вам нужно перезапустить Prometheus, чтобы он прочитал новый конфигурационный файл. Вы можете сделать это с помощью команды:

# systemctl reload prometheus

Если вы все сделали правильно, на странице http://localhost:9090/targets в веб-интерфейсе Prometheus должен появится первый targets. Состояние targets должно быть “UP”, что означает, что он доступен для опроса.

Prometheus targets
Prometheus targets

Отлично, теперь у вас работает мониторинг! Вы можете перейти на вкладку Graf и запросить любую метрику, которую вы отслеживаете. Здесь вы также можете увидеть график изменения этой метрики со временем. Например, вы можете посмотреть график загрузки сервера (node_load1), который показывает среднее значение загрузки за одну минуту.

Графики

В повседневной жизни вы редко будуте обращается к графическим интерфейсам такого типа для просмотра графиков. Скорее всего, вы будем использовать для этого специализированные программы или онлайн-сервисы, такие как Grafana.

Отлично, теперь мы можем открыть Grafana по адресу http://localhost:3000 и войти в систему с указанными учетными данными. Внутри мы можем настроить различные параметры через веб-интерфейс, если это необходимо. В боковой панели мы нажимаем на “Configuration” (шестеренка) и затем выбираем “Preferences”.

Dashboard Grafana
Dashboard Grafana

Теперь мы переходим на вкладку “Data Sources” и добавляем наш Prometheus.

Data Source Grafana
Data Source Grafana

Теперь мы добавляем готовый дашборд “Node exporter full”, который является лучшим стартовым дашбордом. Мы можем найти его в разделе “Dashboards” (квадрат), затем “Manage” и “Import”.

Import Dashboard 1860
Import Dashboard 1860

После этого мы вводим “1860” и убираем курсор из этого поля, чтобы начать импорт. Затем мы указываем источник данных и нажимаем “import”.

Import Dashboard
Import Dashboard

Отлично! Теперь вы можете наблюдать за работой своих серверов через Grafana.

Если у вас есть серьезные намерения и вы хотите, чтобы все компоненты запускались автоматически после перезагрузки системы, не забудьте настроить систему инициализации systemd.

# systemctl enable prometheus
# systemctl enable grafana
# systemctl enable alertmanager
# systemctl enable node_exporter

GPG инструкции

Коротенький мануал по GPG — GNU Privacy Guard, бесплатной программе для шифрования и цифровых подписей.

Инструкции

LinuxГенерация ключа

Выполняем команду:

$ gpg --full-gen-key

Выбираем тип ключа (1) RSA and RSA (default) и жмём Enter:

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1

Указываем длину ключа (2048 норм, но можно выбрать и побольше, при эпизодических шифрованиях/подписаниях проседания производительности незаметны). Если 2048 ОК, жмём Enter:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 

Указываем срок действия ключа, стандартно пять лет:

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 5y

Подтверждаем, что пять лет это ОК:

Key expires at Пн 02 сен 2024 15:10:41 MSK
Is this correct? (y/N) y

Если хотим, вводим реальное имя (атрибут открытого ключа, который могут прочитать все, имеющие доступ к открытому ключу):

GnuPG needs to construct a user ID to identify your key.

Real name: Ivan Ivanov

Следующее поле прямо влияет на удобство работы корреспондентов — почтовые программы автоматически находят нужный ключ из локального списка ключей, если установлен режим шифрованной передачи почты:

Email address: i.ivanov@mycompany.com

Необязательное поле Comment:

Comment: Test key

Подтверждаем, что всё введённое ОК:

You selected this USER-ID:
    "Ivan Ivanov (Test key) <i.ivanov@mycompany.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

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

┌──────────────────────────────────────────────────────┐
│ Please enter the passphrase to                       │
│ protect your new key                                 │
│                                                      │
│ Passphrase: ________________________________________ │
│                                                      │
│       <OK>                              <Cancel>     │
└──────────────────────────────────────────────────────┘

В случае утери, восстановить пароль, кроме как полным перебором, за приемлемое время невозможно! Убедительная просьба сначала сгенерить и сохранить его, например, в KeePass, а после ввести в gpg.

Ждём, пока программа сгенерирует закрытый ключ и получаем сведения о вновь созданной ключевой паре:

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /home/iivanov/.gnupg/trustdb.gpg: trustdb created
gpg: key 6C29A802EAB3EEBF marked as ultimately trusted
gpg: directory '/home/iivanov/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/iivanov/.gnupg/openpgp-revocs.d/D725486ABD7E69297D3E15CD6C29A802EAB3EEBF.rev'
public and secret key created and signed.

pub   rsa2048 2019-09-04 [SC] [expires: 2024-09-02]
      D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
uid                      Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>
sub   rsa2048 2019-09-04 [E] [expires: 2024-09-02]

Обмен ключами

Экспорт открытого ключа

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

$ gpg -k

Полный (он же длинный) идентификатор ключей выводится вот такой командой:

gpg --keyid-format LONG -k

Выбираем нужный ключ из списка (копируем его ID: D725486ABD7E69297D3E15CD6C29A802EAB3EEBF)

/home/iivanov/.gnupg/pubring.kbx
------------------------
pub   rsa2048 2019-09-04 [SC] [expires: 2024-09-02]
      D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
uid           [ultimate] Ivan Ivanov (Test key) <i.ivanov@mycompany.com>
sub   rsa2048 2019-09-04 [E] [expires: 2024-09-02]

и экспортируем его в файл, закодированный в base64:

$ gpg -a --export D725486ABD7E69297D3E15CD6C29A802EAB3EEBF > /tmp/pkey.asc

Содержимое файла будет выглядеть примерно так:

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBF1vrh8BCACXKHa9U1wdrszBAXh24HfFscsz9agwJaJvaihKYHI9iREV15/D
...много похожих строк...
-----END PGP PUBLIC KEY BLOCK-----

Отдаём содержимое этого файла корреспонденту. По другому каналу (личная встреча, телефонный звонок) убеждаемся, что ID ключа у корреспондента совпадает с исходно сгенерированным, дабы исключить возможную подмену.

Импорт открытого ключа

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

Ключ импортируется следующим образом:

 $ gpg --import i.ivanov.pkey.asc

получаем сообщение об успешном импорте:

gpg: key 674BD323E193D06D: public key "Ivan Ivanov <i.ivanov@mycompany.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1

Чтобы при отправке шифровки система не переспрашивала, доверяем ли мы этому ключу, повысим уровень доверия. Выводим список открытых ключей (выбираем ID ключа, доверие к которому хотим повысить: C973F1E2B626BA80B880FE8D674BD323E193D06D):

/home/iivanov/.gnupg/pubring.kbx
------------------------
pub   rsa2048 2019-09-04 [SC] [expires: 2024-09-02]
      D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
uid           [ultimate] Ivan Ivanov (Test key) <i.ivanov@mycompany.com>
sub   rsa2048 2019-09-04 [E] [expires: 2024-09-02]

pub   rsa4096 2018-11-02 [SC] [expires: 2023-11-01]
      C973F1E2B626BA80B880FE8D674BD323E193D06D
uid           [ unknown] Petr Petrov <p.petrov@mycompany.com>
sub   rsa4096 2018-11-02 [E] [expires: 2023-11-01]

переходим в режим правки ключа:

$ gpg --edit-key C973F1E2B626BA80B880FE8D674BD323E193D06D

в появившейся консоли gpg говорим trust:

gpg (GnuPG) 2.2.17; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  rsa4096/674BD323E193D06D
     created: 2018-11-02  expires: 2023-11-01  usage: SC  
     trust: unknown       validity: unknown
sub  rsa4096/1CABB6C0C7A14100
     created: 2018-11-02  expires: 2023-11-01  usage: E   
[ unknown] (1). Ivan Ivanov <i.ivanov@mycompany.com>

gpg> trust

Если ключ удалось подтвердить по независимому каналу, указываем пятый уровень (I trust ultimately) и подтверждаем выбор вводом y и жмём Enter:

pub  rsa4096/674BD323E193D06D
     created: 2018-11-02  expires: 2023-11-01  usage: SC  
     trust: unknown       validity: unknown
sub  rsa4096/1CABB6C0C7A14100
     created: 2018-11-02  expires: 2023-11-01  usage: E   
[ unknown] (1). Ivan Ivanov <i.ivanov@mycompany.com>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

получаем сообщение об изменении уровня доверия ключу:


pub  rsa4096/674BD323E193D06D
     created: 2018-11-02  expires: 2023-11-01  usage: SC  
     trust: ultimate      validity: unknown
sub  rsa4096/1CABB6C0C7A14100
     created: 2018-11-02  expires: 2023-11-01  usage: E   
[ unknown] (1). Ivan Ivanov <i.ivanov@mycompany.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> 

и выходим из консоли gpg с помощью Ctrl-d.

Обмен зашифрованными сообщениями

Отправка зашифрованного сообщения

Перед отправкой зашифрованного сообщения (в случае шифрования и отправки зашифрованного сообщения с помощью почтовой программы это действие чаще всего происходит автоматически) уточняем ID ключа получателя с помощью команды gpg -k. Шифруем файл с сообщением:

$ gpg -ea -r C973F1E2B626BA80B880FE8D674BD323E193D06D plain_message.txt

зашифрованная копия этого файла автоматически сохранится в plain_message.txt.asc. Если нужно задать конкретное имя зашифрованному файлу, команда будет выглядеть следующим образом:

$ gpg -ea -o for_ivanov.asc -r D725486ABD7E69297D3E15CD6C29A802EAB3EEBF plain_message.txt

Важно: Порядок опций должен идти строго так, как задано в примере. По какой-то причине другой порядок, например, имя зашифрованной копии в конце команды, gpg не понимает.

Где опции команды означают следующее:

  • -e — шифровать сообщение;
  • -a — результат закодировать в base64;
  • -r — ID ключа или адрес электронной почты получателя шифровки.

Результатом выполнения команды должен быть файл примерно такого вида:

-----BEGIN PGP MESSAGE-----

hQIMAxyrtsDHoUEAAQ/+M3NYvPh6xvPLzxmftRLcMWqRmR42Xxs4+vWAlt047zFQ
...много похожих строк...
-----END PGP MESSAGE-----

Наличие -----BEGIN PGP MESSAGE----- говорит о том, что это сообщение зашифровано и его можно смело отправлять получателю по незащищённому каналу связи.

Получение зашифрованного сообщения

Выполняется командой

$ gpg -o for_iivanov.txt -d for_iivanov.gpg.asc 

где опции:

  • -o — имя расшифрованного файла;
  • -d — имя файла для расшифровки.

команда скажет, каким ключом было зашифровано сообщение:

gpg: encrypted with 2048-bit RSA key, ID 7FA3C70345848788, created 2019-09-04
      "Ivan Ivanov (Test key) <i.ivanov@mycompany.com>"

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

Цифровая подпись

Подписание сообщений

Чтобы гарантировать подлинность и неотчуждаемость сообщения, используется цифровая подпись. Есть два основных типа цифровой подписи:

  • Отделённая — содержимое подписи хранится в отдельном файле от подписываемого;
  • Внедрённая — подписываемое сообщение и сама подпись хранятся в одном файле.

Создание отделённой подписи:

$ gpg -o signature.asc -a -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF --detach-sig message2sign.txt

опция -u указывает ID закрытого ключа, которым нужно подписать сообщение. Если подписант обладает только одним закрытым ключом, эту опцию можно не указывать (т.е. -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF).

Создание внедрённой подписи:

$ gpg -o signed_message.asc -a -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF --clearsign message2sign.txt

Содержимое файла с внедрённой цифровой подписью (signed_message.asc) выглядит так:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Это я-на.
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEE1yVIar1+aSl9PhXNbCmoAuqz7r8FAl1vwbYACgkQbCmoAuqz
...много похожих строк...
=XRwC
-----END PGP SIGNATURE-----

Есть ещё один способ создания внедрённой подписи (с менее читабельным результатом):

$ gpg -o signed_message.asc -a -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF -s message2sign.txt

результат:

-----BEGIN PGP MESSAGE-----

owEBbQGS/pANAwAIAWwpqALqs+6/AawmYhBtZXNzYWdlMnNpZ24udHh0XW/DnNCt
...много похожих строк...
=yYVo
-----END PGP MESSAGE-----

Для простого текста, требующего цифровой подписи, лучше использовать “первую” внедрённую подпись (создаваемую опцией clearsign).

Проверка подписей

Внедрённая подпись:

$ gpg --verify signed_message.asc

результат:

gpg: Signature made Ср 04 сен 2019 16:52:54 MSK
gpg:                using RSA key D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
gpg: Good signature from "Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>" [ultimate]

Отделённая подпись:

$ gpg --verify signature.asc message2sign.txt

результат:

gpg: Signature made Ср 04 сен 2019 16:56:41 MSK
gpg:                using RSA key D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
gpg: Good signature from "Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>" [ultimate]

Отправка подписанных шифровок

$ gpg -ea -s -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF -r C973F1E2B626BA80B880FE8D674BD323E193D06D message2signencrypt.txt

При расшифровке таких сообщений в выводе команды будет добавлена информация о цифровой подписи, например:

gpg: encrypted with 2048-bit RSA key, ID 7FA3C70345848788, created 2019-09-04
      "Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>"
gpg: Signature made Ср 04 сен 2019 17:07:58 MSK
gpg:                using RSA key C973F1E2B626BA80B880FE8D674BD323E193D06D
gpg: Good signature from "Petr Petrov <p.petrov@mycompany.com>" [ultimate]

Расшифровываются такие сообщения так же, как и просто зашифрованные.

Если есть вопросы задавайте их в комментариях. Понравилась статья? Расскажите о ней друзьям в социальных сетях.