Skip to content

Instantly share code, notes, and snippets.

@teplostanski
Last active June 12, 2024 10:29
Show Gist options
  • Save teplostanski/f1f01071a1118e9d7c2f32e01a022a96 to your computer and use it in GitHub Desktop.
Save teplostanski/f1f01071a1118e9d7c2f32e01a022a96 to your computer and use it in GitHub Desktop.
Шпаргалки по программам, утилитам и администрированию линукс

Принудительное использование цветового профиля sRGB в Chrome

Нужно вставить в адресную строку chrome://flags/#force-color-profile и в поле Force color profile выбрать sRGB

Important

В Chrome 100 удален флаг #force-color-profile.

Ниже приведены два временных метода, которые можно использовать, пока они продолжают работать:

  1. Запустите Chrome, добавив следующий переключатель в целевое поле: --force-color-profile=srgb

  2. Повторно включите старые флаги, chrome://flags/ включив:

  • Временно продлить срок действия флагов M98 ( #temporary-unexpire-flags-m98)
  • Временно продлить срок действия флагов M99 ( #temporary-unexpire-flags-m99)

Это реанимирует #force-color-profile.

ОСНОВНЫЕ КОМАНДЫ И ОПЦИИ

--armor -a — Создаёт ASCII (символьный) вывод. При шифровании GPG по умолчанию создаёт бинарный вывод. При использовании этой опции GPG кодирует информацию кодировкой Radix-64 (Разновидность Base64). Этот текстовой вывод можно, например, отправить в мессенджере или по электронной почте, а также вывести на экран.

--encrypt -e — Зашифровать сообщение.

--recipient -r — Указать ключ, который будет использоваться для шифрования. Можно использовать информацию идентификатор пользователя (имя, почта), идентификатор ключа, отпечаток ключа.

--decrypt -d — Расшифровать сообщение.

--sign -s — Подписать сообщение. Подпись при этом будет распологаться отдельно от самого сообщения.

--clear-sign --clearsign — Подписать сообщение. Подпись при этом сохраняется вместе с сообщением.

--local-user -u — Указать ключ, который будет использоваться для подписи. Схож с опцией --recipient, но это не одно и то же.

--verify — Проверить подпись.

--list-keys -k — Вывести список публичных ключей.

--list-secret-keys -K — Вывести список приватных ключей.

--export — экспортировать публичный ключ в файл, который потом можно куда нибудь отправить.

--export-secret-keys — экспортировать все секретные ключи

--export-secret-subkeys — экспортировать все серкетные сабключи

--import — импортировать ключ.

--edit-key — Редактировать ключ.

change-usage

Изменить признаки назначения (возможности) первичного ключа или подключей. Эти признаки назначения, напр. Certify (подпись ключа), Sign (подпись данных) Authenticate (удостоверение личности), Encrypt (шифрование) устанавливаются во время создания ключа. Иногда полезно иметь возможность изменять их (например, добавить удостоверение личности) после создания. Делайте это с осторожностью; допустимые признаки назначения зависят от алгоритма ключа.

--expert — "Режим эксперта". Используется в связке с --edit-key и --full-gen-key

--delete-key — Удалить публичные ключи

--delete-secret-keys — удалить приватные ключи

--help — Более подробный список.

ШИФРОВАНИЕ ФАЙЛОВ

gpg -a -r 0x12345678 -e decrypted.txt > encrypted.gpg

Зашифровать файл decrypted.txt в файл encrypted.gpg ключом 0x12345678. При этом готовый файл будет текстовым, а не бинарным.

gpg -r 0x12345678 -d encrypted.gpg > decrypted.txt

Расшифровать файл encrypted.gpg ключом 0x12345678 и сохранить его в файл decrypted.txt.

НАСТРОЙКА

Для комфортной работы нужно настроить gpg. Для этого в файл /home/USER/.gnupg/gpg.conf нужно вставить следующее:

keyid-format 0xlong
throw-keyids
no-emit-version
no-comments
with-fingerprint
with-fingerprint

keyid-format 0xlong — формат вывода идентификатора ключа. У каждого ключа и подключа есть свой идентификатор. По умолчанию он не выводится, раньше выводилась его короткая версия.

Доступные форматы:

none — Не выводить (По умолчанию).

short — Короткая запись.

0xshort — Короткая запись с префиксом "0x".

long — Длинная запись.

0xlong — длинная запись с префиксом "0x".

throw-keyids — Не включать информацию о ключе в зашифрованное сообщение. Эта опция может быть полезна для анонимизации получателя сообщения.

no-emit-version — Не вставлять версию GPG в зашифрованное сообщение.

no-comments — Убирает все комментарии из зашифрованного сообщения.

with-fingerprint Список всех ключей с их отпечатками. Если команду использовать дважды, также отображаются отпечатки всех sub ключей.

Всё это — опции, которые можно найти в пункте 4.2.1 Изменение настроек в Официальной документации Gnupg на русском языке, в файле конфигурации они записываются без префикса "--".

Диалоговые окна ввода пассфразы

Pynentry — это те самые диалоговые окна. Помимо tty-версии (консольной) есть ещё несколько версий (графических), которые можно попробовать : pinentry-gtk-2 pinentry-qt pinentry-gnome3 .

  • pinentry-tty (консольное диалоговое окно)

Добавить в файл ~/.gnupg/gpg-agent.conf данную строчку:

pinentry-program /usr/bin/pinentry-tty

Пример:

Please enter the passphrase for the ssh key
  MD5:59:ab:34:d3:80:1c:ba:74:bd:28:92:f9:c4:2e:21:57

Passphrase: 
  • pinentry-curses (псевдо-графическое диалоговое окно)

Добавить в файл ~/.gnupg/gpg-agent.conf данную строчку:

pinentry-program /usr/bin/pinentry-tty

Пример:

     ┌──────────────────────────────────────────────────────┐
     │ Please enter the passphrase for the ssh key          │
     │ MD5:59:ab:34:d3:80:1c:ba:74:bd:28:92:f9:c4:2e:21:57  │
     │                                                      │
     │                                                      │
     │ Passphrase: ________________________________________ │
     │                                                      │
     │       <OK>                              <Cancel>     │
     └──────────────────────────────────────────────────────┘

Затем перезапустите gpg-agent. На системах с systemd это делается так:

sudo systemctl reload gpg-agent

или

gpg-connect-agent reloadagent /bye

или убить агент

q```sh gpg-connect-agent updatestartuptty /bye



#   ЭКСПОРТ

> !ВАЖНО ПОМНИТЬ что любой сабключ хранит в себе информацию о главном ключе.

- Экспорт primary key

gpg -a --export-secret-keys ИМЯ_КЛЮЧА > primary_key.gpg




- Экспорт Сабключей

gpg -a --export-secret-subkeys ИМЯ_КЛЮЧА > sec_subs.gpg




- Экспорт КОНКРЕТНОГО Сабключа

Чтобы экспортировать только один  конкретный sub ключ, идентификатор sub ключа можно указать с помощью  символа «!»  восклицательный знак в конце идентификатора ключа указывает gpg экспортировать только этот конкретный sub ключ. 

> Например я хочу подписывать эмэйлы. Thunderbird начиная с версии 78 поддерживаете OpenPGP. Я создал отдельный сабключ только для подписей и экпортирую именно его чтобы использовать в Thunderbird.
>
> Примечание: Громовой птичке нужно скармливать именно секретные ключи.

gpg --export-secret-subkeys --armor --output sec_Sign_0x3D481AB809941D3B.gpg 0x3D481AB809941D3B!




- Экспорт КОНКРЕТНОГО public keys

gpg --export --armor --output Sign_pub_0x3D481AB809941D3B.gpg 0x3D481AB809941D3B!




#  УДАЛЕНИЕ

`--delete-key` — Удалить публичные ключи

`--delete-secret-keys` — удалить приватные ключи



# ПЕРЕЗАПУСК АГЕНТА



```sh
systemd --user reload gpg-agent

или

gpg-connect-agent reloadagent /bye

или убить агент

gpg-connect-agent updatestartuptty /bye

АУТЕНТИФИКАЦИЯ SSH

Что такое и зачем нужен SSH Agent

SSH Agent (SSH Агент) хранит в памяти компьютера закрытые SSH-ключи. Когда SSH-клиент (/usr/bin/ssh в линуксе и макоси, например) пытается подключиться к серверу при помощи ключа, она сначала делает запрос к SSH Agent и просит у него закрытый ключ, если у агента он есть, то ключ отдаётся программе, которая использует его для подключения.

Без SSH Agent SSH-клиент напрямую читает ключи с диска, в линуксе и макоси они лежат в каталоге ~/.ssh, если ключ зашифрован, то клиент спрашивает соответствующую парольную фразу. SSH Agent избавляет от многочисленных запросов такой парольной фразы.

В linux и macos по умолчанию стоит /usr/bin/ssh-agent из openssh, однако он малофунциональный и сложный в настройке. Вместо него можно использовать агент из комплекта gnupg (gpg-agent), он умеет не только PGP-ключами управлять, но и выполнять функцию SSH Агента. У gpg-agent есть два преимущества: он настраивается, а также позволяет задавать пароли для шифрования ключей в памяти.

  • Включить в gpg-agent поддержку ssh
echo enable-ssh-support >> $HOME/.gnupg/gpg-agent.conf
  • Добавить в конец файла .bashprofile(если в нём указан путь до .bashrc, то следует править .bashrc) или .zshrc(файлы скрыты в /home):

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

unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
  • Включить сабключ gpg для аутентификации ssh:

Получить keygrip сабключа

gpg --list-keys --with-keygrip

output:

/home/USER/.gnupg/pubring.kbx
--------------------------------------------
pub   rsa4096 2018-07-27 [C] [expires: 2019-07-27]
      F8DD1C85581AB87675EF97444EF9EF4CDBD7AB1B
      Keygrip = 22DBE374608C6220B321D3A2543F3806FF63A49D
uid           [ultimate] Mattia Cattarinussi <example@email.com>
sub   rsa4096 2018-07-27 [SEA] [expires: 2019-07-27]
      Keygrip = A55719832AF939C531BACFFABB2A47B52FFBBF43
  • Добавить keygrip вашего подключа в список одобренных ключей.
echo A55719832AF939C531BACFFABB2A47B52FFBBF43 >> ~/.gnupg/sshcontrol
  • Обязательно нужно перезапустить агент
systemd --user reload gpg-agent

или

gpg-connect-agent reloadagent /bye

или убить агент

gpg-connect-agent updatestartuptty /bye
  • Проверить, присутствует ли ключ в списке идентификаторов ssh
ssh-add -l

output:

4096 SHA256:bCVzkgaoGSqJC89hZ/8gclTn7ENN/dJ+mZBBw2zJFuI (none) (RSA)

ssh-add -l - Просмотр хэша ключа

ssh-add -L - Просмотр публичного ключа

  • Если терминал вместо ключай выдаёт ошибку, нужно перезагрузить компьютер:
reboot

ИЛИ:

sudo reboot

ЕСЛИ SSH-AGENT НЕ МЕНЯЕТСЯ НА GPG-AGENT ИЛИ НЕ ДОБАВЛЯЮТСЯ SSH КЛЮЧИ

pkill -f gpg-agent
gpg-connect-agent /bye
rm -rf $(dirname $SSH_AUTH_SOCK)/*

!!! ВНИМАНИЕ, ДАННЫЕ ДЕЙСТВИЯ УДАЛЯТ ВСЕ КЛЮЧИ GPG ИЛИ SSH !!!

Получить публичный ключ ssh для подраздела

gpg --export-ssh-key ИМЯ_КЛЮЧА

output:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC6sY7mORS51qy8saZ2uFXvbkg5m2jW2G2WNWYLd84vO6XJLus4rK/
MulX86uA5v3AJITnK5qwqwewBeUlricspdwMlKEl34BsX1+Sgo060bcgEJE/zk48WQQW9QAM4W86ltl9jk6G1jds4TU
NPKxOQN/9xJmK/zbBahLUrbMcLrCdJ7JT/IlG5uv66TTbdj2i6a3s9siQhdvlLznpgWuZi3lkPtZasty84fijYf38hl
cacMUX2AWlfZUcNi/o9uORS31sqnepFjy/EcpivBb4YrVfICN+3RB1Eh7yip6LUZ07VLPzoHQCnBF64KxYjzgfuKD6q
42mv9+Yu86t3ioOEHCMjt0SfhZcb6c9b/y4aL/FzILcVIedHjqNzigfl9qRKVPHq9Kh480OdQFurouAIqg94+iUJu00
rJhdrq9p1PCAPL20jkW/ZSOzjJ9yc1RwDUoLNeFQD2BfTMGRR0/x4uJaEnEg5hur7hm+bQZfL49Kv6erqopJTEKYB77
8kG+M= openpgp:0x526D487D

**Можно проверить, работает ли ключ с вашей учетной записью Github. **

ssh -T git@github.com

Если всё прошло успешно, терминал выдаст сообщение:

output:

  Hi mcattarinussi! You've successfully authenticated, but GitHub does not provide shell access.

Авторизация на удалённом сервере

  1. Сохраните этот ключ в файл
ssh-add -L >> authorized_keys
  1. скопируйте этот авторизованный ключ на удаленную машину
ssh-copy-id root@192.168.1.7

output:

root@192.168.1.7's password: 
                                                                                                                                                       100%  776     0.8KB/s   00:00

Настройка файла sshcontrol

Если отрыть файл sshcontrol

nano ~/.gnupg/sshcontrol

То в нём содержится следующее:

                ┌─────────────────────────── идентификатор ключа  
                │                        ┌── TTL кеширования в секундах
────────────────┴─────────────────────── ┴
A55719832AF939C531BACFFABB2A47B52FFBBF43 0

TTL кеширование — это время в секундах после расшифровки, в течение которого запрос ключа не потребует пароля. Если указать 0, будет использоваться TTL по умолчанию (он задаётся аргументом default-cache-ttl-ssh в конфиге ~/.gnupg/gpg-agent.conf).

Перед идентификатором можно указать восклицательный знак (!) такой ключ будет выключен, это по сути то же самое, что и комментирование этой строчки через #.

Также можно для ключа указать набор флагов (третьим полем после TTL, оно опциональное):

                ┌───────────────────────────── идентификатор ключа  
                │                        ┌──── TTL кеширования в секундах (0 — не кешировать)
                │                        │ ┌── флаги (пока только confirm)
────────────────┴─────────────────────── ┴ ┴──────
3BC01B6F0043256039006294F76C45139B703DBF 0 confirm

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

ДОБАВЛЕНИЕ ОБЫЧНОГО SSH КЛЮЧА В GPG-AGENT

Смена прав на ключ

chmod 0600 ~/.ssh/<имя ключа>

Добавление в агент

ssh-add ~/.ssh/<имя ключа>

Сначала ssh спросит парольную фразу для ключа, после чего появится диалог, где нужно выбрать пароль для шифрования ключа в агенте, обычно это простая короткая фраза (НЕ пароль к оригинальному ключу!):

GnuPG Agent key add password

Этот пароль (а не оригинальную парольную фразу!) нужно будет ввести, когда сторонняя программа затребует ключ:

GnuPG Agent password

Идентификатор добавленного ключа сохраняется в файле ~/.gnupg/sshcontrol в виде блока такого формата:

# RSA key added on: 2017-12-13 14:07:27
# Fingerprints:  MD5:0c:01:91:7c:49:40:f8:7c:74:64:74:bd:7e:c8:7a:e9
#                SHA256:hnOuTZzfe2ak10Jd6bl60kE9yAUqw34KinJ3H4opNbs
3BC01B6F0043256039006294F76C45139B703DBF 0

ЦИФРОВАЯ ПОДПИСЬ ФАЙЛА

Создание

GnuPG позволяет использовать несколько типов подписей:

  • встроенная в файл: содержимое файла изменяется так, чтобы в него была добавлена ЭЦП. Чаще всего применяется при отправке подписанных сообщений по электронной почте;
  • отсоединённая в текстовом формате: создаётся файл с расширением *.asc вида mydocument.pdf.asc (где mydocument.pdf— имя оригинального файла);
  • отсоединённая в двоичном формате: создаётся файл с расширением *.sig вида mydocument.pdf.sig в бинарном формате. Для создания ЭЦП файла используется закрытый ключ из нашей ключевой пары, а для проверки — открытый.

Создадим отсоединённую подпись в текстовом формате:

gpg --sign --detach-sign --default-key 0xD45AB90A --armor mydocument.pdf

Здесь 0xD45AB90A — отпечаток ключа нашей ключевой пары, а mydocument.pdf — имя файла, который мы будем подписывать ЭЦП.

Создадим отсоединённую подпись в двоичном формате:

gpg --sign --detach-sign --default-key 0xD45AB90A mydocument.pdf

Все параметры идентичны, но на выходе будет получен файл mydocument.pdf.sig.

Создадим встроенную в файл подпись в текстовом формате:

gpg --sign --default-key 0xD45AB90A --armor mydocument.pdf

Создадим встроенную в файл подпись в двоичном формате:

gpg --sign --default-key 0xD45AB90A mydocument.pdf

Внимание! При создании встроенных подписей содержимое файла-источника целиком включается внутрь, поэтому использовать данный формат не желательно из-за дублирования и значительного размера. Далее в статье мы будем рассматривать только отсоединённую ЭЦП, т.к. это самый популярный вариант подписи.

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

Для проверки подписи используется опция --verify.

Цифровая подпись может быть интегрирована в файл, а может содержаться в отдельном файле. От этого зависит запуск команды gpg, если цифровая подпись интегрирована в файл, то достаточно указать опцию --verify, а затем проверяемый файл:

gpg --verify test.php.gpg

Если цифровая подпись отделена от файла, то после опции --verify нужно указать два аргумента: вначале идёт файл с подписью, а затем подписанные данные:

gpg --verify test.php.sig test.php

Кстати, для проверки подписи есть специальная программа gpgv, которая заменяет собой конструкцию gpg --verify, то есть предыдущие команды можно записать так:

gpgv test.php.gpg

и

gpgv test.php.sig test.php

Подпись коммитов

  • Добавление ключа в Git

Если у вас есть приватный ключ для подписи, вы можете настроить Git так, чтобы этот ключ использовался для подписи, установив значение параметр user.signingkey config.

git config --global user.signingkey 0A46826A

Теперь Git будет использовать ваш ключ по умолчанию для подписи тегов и коммитов.

Персонально для репозитория можно указать другой GPG ключ. Например я так сделал для работы:

git config --local user.signingkey 7BGC7M6M
  • Ручное добавление

Так же можно добавить ключ вручную в файл .gitconfig в параметр signingkey.

Для глобальной настройки:

[user]
	name = John Doe
	email = doe@example.com
	signingkey = Q6RNBLWTDFVRXX8YBWTSWDDX3C7AA332JRTVFT8T
[commit]
	gpgsign = true
[core]
	autocrlf = input

Для персональной настройки репозитория используется переменная signingkey в файле config, который лежит в папке .git.

[user]
	name = John Doe
	email = doe@example.com
    signingkey = JFU7GGCEGQ3CY59E67Y9FAG2U83SN43N2G6DTBBP
  • Подписание коммитов

В более поздних версиях Git’а (v1.7.9 и выше) можно подписывать отдельные коммиты. Если вы хотите подписывать коммиты напрямую, а не только теги, вам нужно добавить -S к вашей команде git.

  git commit -a -S -m 'Signed commit'
  • Чтобы увидеть и проверить эти подписи, существует также опция --show-signature для git-лога.
git log --show-signature -1

KEY SERVERS

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

Внимание! Ключи, отправленные на сервер ключей, невозможно удалить! Их можно только отозвать, импортировав сертификат отзыва на сервер, при этом ключ всё равно остаётся на сервере.

  • ОБНОВЛЕНИЕ СЕРВЕРОВ

    gpg --keyserver <URL> --refresh-keys

  • ОТПРАВКА НА СЕРВЕР

    gpg --keyserver <URL> --send-keys <KeyID>

  • **Получить публичный ключ с идентификатором ключа с сервера ** gpg --keyserver <URL> --recv-keys <KeyID>

  • Найти ключ на сервере gpg --keyserver <URL> --search-keys <UID или KeyID>

  • СПИСОК СЕРВЕРОВ

    • hkps://hkps.pool.sks-keyservers.net:443
    • hkp://ipv4.pool.sks-keyservers.net:11371
    • hkp://pgp.mit.edu
    • hkp://keys.gnupg.net
    • hkp://keyserver.ubuntu.com
    • hkp://keyserver.pgp.com

Сценарий безопасного хранения ключей

Шаг 1 Бэкап

Формат файла не имеет значения будь то asc gpg pgp или вообще без формата

gpg --output ИМЯ_ФАЙЛА.gpg --armor --export-secret-keys --export-options export-backup ИМЯ_КЛЮЧА

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

Шаг 2 Экспорт primary key

gpg -a --export-secret-keys ИМЯ_КЛЮЧА > primary_key.gpg

Шаг 3 Создание Revocation Certificate

gpg -a --gen-revoke ИМЯ_КЛЮЧА > rev_cert.gpg

Очень важно хранить секретный ключ в супернадежном месте.

revocation certificate тоже важно хранить где-либо куда никто кроме вас не имеет доступ.

Шаг 4 Экспорт Сабключей

gpg -a --export-secret-subkeys ИМЯ_КЛЮЧА > sec_subs.gpg

Шаг 5 Удаление Primary Key

Теперь удалим всю секретную часть нашего ключа:

gpg --delete-secret-keys ИМЯ_КЛЮЧА

При этом надо понимать, что у нас останется публичная часть нашего ключа

Шаг 6 Импорт Сабключей

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

gpg --import sec_subs.gpg

Надо понимать, что знак # рядом с sec означает что primary часть секретного ключа отсутствует в нашей связке ключей.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment