<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@benderinoz</title><author><name>@benderinoz</name></author><id>https://teletype.in/atom/benderinoz</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/benderinoz?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/benderinoz?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-03T18:57:51.215Z</updated><entry><id>benderinoz:kubernetes-tips</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/kubernetes-tips?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>K8S Tips</title><published>2023-11-04T17:08:07.752Z</published><updated>2023-11-04T17:26:32.536Z</updated><category term="docker" label="docker"></category><summary type="html">Kubernetes tips</summary><content type="html">
  &lt;p id=&quot;aG1d&quot;&gt;Reference (Bookmark this page for exam. It will be very handy):&lt;/p&gt;
  &lt;p id=&quot;gRbo&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/reference/kubectl/conventions/&quot; target=&quot;_blank&quot;&gt;https://kubernetes.io/docs/reference/kubectl/conventions/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;I9ZV&quot;&gt;&lt;strong&gt;Create an NGINX Pod&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;V65j&quot;&gt;&lt;code&gt;kubectl run nginx --image=nginx&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VoEo&quot;&gt;&lt;strong&gt;Generate POD Manifest YAML file (-o yaml). Don&amp;#x27;t create it(--dry-run)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;pmHQ&quot;&gt;&lt;code&gt;kubectl run nginx --image=nginx --dry-run=client -o yaml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6fUS&quot;&gt;&lt;strong&gt;Create a deployment&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;DIpL&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JA36&quot;&gt;&lt;strong&gt;Generate Deployment YAML file (-o yaml). Don&amp;#x27;t create it(--dry-run)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;IUyr&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx --dry-run=client -o yaml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;OnSY&quot;&gt;&lt;strong&gt;Generate Deployment YAML file (-o yaml). Don’t create it(–dry-run) and save it to a file.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;18Ns&quot;&gt;&lt;code&gt;kubectl create deployment --image=nginx nginx --dry-run=client -o yaml &amp;gt; nginx-deployment.yaml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ofn6&quot;&gt;&lt;strong&gt;Make necessary changes to the file (for example, adding more replicas) and then create the deployment.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;dcHG&quot;&gt;&lt;code&gt;kubectl create -f nginx-deployment.yaml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KVV7&quot;&gt;&lt;strong&gt;Просмотр подов по метке label&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;7CG3&quot;&gt;kubectl get pods -l app=myapp&lt;/pre&gt;

</content></entry><entry><id>benderinoz:disk-encryption-tpm</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/disk-encryption-tpm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Шифрование диска Linux с помощью TPM2</title><published>2023-08-21T11:36:38.424Z</published><updated>2023-08-21T11:36:38.424Z</updated><category term="encryption" label="encryption"></category><summary type="html">Авторизация от TPM происходит примерно на 24 секунде, полная загрузка ОС на 34 секунде</summary><content type="html">
  &lt;h1 id=&quot;KMqe&quot;&gt;Обязательные условия:&lt;/h1&gt;
  &lt;ul id=&quot;TUML&quot;&gt;
    &lt;li id=&quot;dcRM&quot;&gt;Наличие модуля TPM2 на материнской плате&lt;/li&gt;
    &lt;li id=&quot;BET9&quot;&gt;Использование SecureBoot&lt;/li&gt;
    &lt;li id=&quot;vU9D&quot;&gt;Использование LUKS шифрования при установке системы&lt;/li&gt;
    &lt;li id=&quot;zkah&quot;&gt;Пароль BIOS, SecureBoot, LVM и пароль от учетной записи в системе должны отличаться (для безопасности)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h1 id=&quot;2ULM&quot;&gt;Этапы настройки:&lt;/h1&gt;
  &lt;ol id=&quot;9JhB&quot;&gt;
    &lt;li id=&quot;1L4G&quot;&gt;Устанавливаем пароль доступа в BIOS&lt;/li&gt;
    &lt;li id=&quot;eGEY&quot;&gt;Включаем SecureBoot&lt;br /&gt;&lt;code&gt;BIOS → Security → Secure Boot → Secure Boot [Enabled] (active), ................................Secure Boot mode [Standard]&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;06Nl&quot;&gt;Проверяем доступность модуля&lt;code&gt;TPM2:&lt;br /&gt;BIOS → Advanced → Trusted Computing → Security Device Support [Enable], ......................................SHA256 PCR Bank [Enabled], ......................................Device select [auto]&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;VijX&quot;&gt;Устанавливаем ОС Ubuntu 22.04.3 (актуально на 15 августа 2023)&lt;/li&gt;
    &lt;li id=&quot;2C1u&quot;&gt;На этапе установки &amp;quot;Updates and other software&amp;quot; обязательно включаем пароль в SecureBoot&lt;/li&gt;
    &lt;li id=&quot;xDmD&quot;&gt;На шаге &amp;quot;Installation type&amp;quot; Включаем LVM + Encrypt&lt;/li&gt;
    &lt;li id=&quot;GLu5&quot;&gt;На следующем шаге вводим пароль для шифрования LVM диска.&lt;/li&gt;
    &lt;li id=&quot;k10T&quot;&gt;Далее проводим стандартную установку системы.&lt;/li&gt;
    &lt;li id=&quot;J3iA&quot;&gt;После установки при первом включении нужно выбрать Continue boot&lt;/li&gt;
    &lt;li id=&quot;PEUz&quot;&gt;После установки ОС обновляем все пакеты&lt;br /&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;AUci&quot;&gt;Устанавливаем недостающие пакеты:&lt;br /&gt;Сначала ставим openssh-server и потом можно копипастить все остальное уже через терминал по ssh&lt;br /&gt;&lt;code&gt;sudo apt install -y openssh-server &lt;br /&gt;sudo apt install -y clevis clevis-tpm2 clevis-luks clevis-dracut&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;7WLR&quot;&gt;Предварительно cоздадим резервную копию LUKS-заголовка на случай возникновения каких-либо проблем в будущем:&lt;br /&gt;&lt;code&gt;sudo cryptsetup luksHeaderBackup /dev/nvme0n1p3 --header-backup-file ~/header-nvme0n1p3.img # сделать бэкап заголовков&lt;/code&gt;&lt;br /&gt;&lt;em&gt;Данный файл следует надёжно хранить в безопасном месте на другом носителе. Внутри него находится LUKS заголовок с включением всех созданных ключевых слотов и соответствующих им ключей шифрования. Его восстановление позволит откатить все произведённые ниже изменения.&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;EUja&quot;&gt;Сгенерируем ключевую пару внутри TPM, &amp;quot;pcr_bank&amp;quot;:&amp;quot;sha256&amp;quot; и &amp;quot;pcr_ids&amp;quot;:&amp;quot;0,1&amp;quot; и привяжем её к зашифрованному разделу:&lt;br /&gt;&lt;code&gt;sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 &amp;#x27;{&amp;quot;pcr_bank&amp;quot;:&amp;quot;sha256&amp;quot;,&amp;quot;pcr_ids&amp;quot;:&amp;quot;0,1&amp;quot;}&amp;#x27; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;# /dev/nvme0n1p3 - наш зашифрованный раздел, можно посмотреть через lsblk &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;На ошибку:&lt;br /&gt;&lt;code&gt;Warning: Value 512 is outside of the allowed entropy range, adjusting it. &lt;br /&gt;&lt;/code&gt;можно не обращать внимания&lt;br /&gt;&lt;br /&gt;Вот краткий обзор наиболее часто используемых идентификаторов PCR:&lt;/li&gt;
    &lt;ul id=&quot;zX41&quot;&gt;
      &lt;li id=&quot;E3r9&quot;&gt;PCR 0: Содержит измерения, связанные с прошивкой, включая поставщика прошивки, версию и дату выпуска.&lt;/li&gt;
      &lt;li id=&quot;kFRw&quot;&gt;PCR 1: Содержит измерения, связанные с конфигурацией платформы, включая тип и производителя аппаратной платформы.&lt;/li&gt;
      &lt;li id=&quot;Ti8x&quot;&gt;PCR 2: Содержит измерения, связанные с конфигурацией загрузчика, включая версию загрузчика и параметры конфигурации.&lt;/li&gt;
      &lt;li id=&quot;enB3&quot;&gt;PCR 3: Содержит измерения, связанные с конфигурацией ядра, включая версию ядра и параметры конфигурации.&lt;/li&gt;
      &lt;li id=&quot;BcLH&quot;&gt;PCR 4: Содержит измерения, относящиеся к начальному виртуальному диску (initrd), который используется для загрузки ядра.&lt;/li&gt;
      &lt;li id=&quot;7ynJ&quot;&gt;PCR 5-7: Содержит измерения, связанные с процессом загрузки, включая загрузчики, файлы конфигурации и компоненты для конкретных платформ.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;t1sy&quot;&gt;Проверим, появился ли пункт &lt;strong&gt;clevis&lt;/strong&gt; в списке доступных слотов:&lt;br /&gt;&lt;code&gt;sudo cryptsetup luksDump /dev/nvme0n1p3  &lt;br /&gt;Вывод команды:&lt;br /&gt;... &lt;br /&gt;... &lt;br /&gt;Tokens: &lt;br /&gt;  0: clevis &lt;br /&gt;    Keyslot: 1 &lt;br /&gt;... &lt;br /&gt;...&lt;br /&gt;Если видим подобный вывод, значит токен добавился.&lt;/code&gt;&lt;br /&gt;Для сведения: при необходимости  можно добавлять несколько таких токенов, они будут пронумерованы по порядку кейслотами начиная с Keyslot: 1, так же можно удалить кейслот командой:&lt;br /&gt;&lt;code&gt;sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1 &lt;br /&gt;# ВНИМАНИЕ! эта команда УДАЛЯЕТ добавленный токен&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;74XO&quot;&gt;При успешном добавлении токена пересоздаем образ initrd ядра, который будет включать в себя модуль работы с TPM для ранней стадии загрузки системы:&lt;br /&gt;&lt;code&gt;sudo dracut -f &lt;/code&gt;# при изменении\добавлении новых токенов снова запускать dracut не требуется&lt;/li&gt;
    &lt;li id=&quot;6hdo&quot;&gt;Перезагружаем систему:&lt;br /&gt;&lt;code&gt;sudo systemctl reboot&lt;/code&gt;&lt;br /&gt;После этого при включении будет выполнен запрос на ввод пароля, а Clevis подставит пин разблокировки из модуля TPM&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h1 id=&quot;XhgG&quot;&gt;Примечания:&lt;/h1&gt;
  &lt;pre id=&quot;3J80&quot;&gt;sudo tpm2_pcrread # Отобразить PCR значения из модуля TPM&lt;/pre&gt;
  &lt;p id=&quot;cPaw&quot;&gt;Авторизация от TPM происходит примерно на 24 секунде, полная загрузка ОС на 34 секунде&lt;/p&gt;
  &lt;h1 id=&quot;TVwY&quot;&gt;Решение проблем:&lt;/h1&gt;
  &lt;ul id=&quot;eUbX&quot;&gt;
    &lt;li id=&quot;XQ3u&quot;&gt;При сбросе BIOS или при попытке подключить другой SSD к материнке - настроки будут сбиты.&lt;/li&gt;
    &lt;li id=&quot;woFr&quot;&gt;Если подключить флешку и перезагрузиться - потребуется пароль. После отключения флешки снова загрузится стандартно.&lt;/li&gt;
    &lt;li id=&quot;CTB6&quot;&gt;Для восстановления работоспособности нужно вернуть SecureBoot в режим Active (Standard) и проверить загрузку.&lt;/li&gt;
    &lt;li id=&quot;xkJv&quot;&gt;Если LUKS не расшифровывается, то  удаляем существующий токен командой:&lt;br /&gt;sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1 &lt;br /&gt;и затем повторяем шаги 13, 14.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h1 id=&quot;kh55&quot;&gt;Источники:&lt;/h1&gt;
  &lt;p id=&quot;M66l&quot;&gt;&lt;a href=&quot;https://www.easycoding.org/2019/09/24/avtomaticheski-razblokiruem-luks-diski-pri-pomoshhi-tpm.html&quot; target=&quot;_blank&quot;&gt;https://www.easycoding.org/2019/09/24/avtomaticheski-razblokiruem-luks-diski-pri-pomoshhi-tpm.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://techjungle.gitlab.io/post/binding_luks_with_tpm/&quot; target=&quot;_blank&quot;&gt;https://techjungle.gitlab.io/post/binding_luks_with_tpm/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/latchset/clevis&quot; target=&quot;_blank&quot;&gt;https://github.com/latchset/clevis&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>benderinoz:docker-inspect-parsing</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/docker-inspect-parsing?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Docker -  форматированный вывод информации о контейнерах</title><published>2023-08-21T11:23:44.446Z</published><updated>2023-08-21T14:20:12.426Z</updated><category term="docker" label="docker"></category><summary type="html">Обычный вывод о запущенном контейнере:</summary><content type="html">
  &lt;p id=&quot;pwuY&quot;&gt;Обычный вывод о запущенном контейнере:&lt;/p&gt;
  &lt;pre id=&quot;YArS&quot;&gt;&amp;gt; $ docker inspect dbe556947aef&lt;/pre&gt;
  &lt;p id=&quot;vOPw&quot;&gt;Такая команда выведет вс информацию в stdout&lt;/p&gt;
  &lt;p id=&quot;EN7t&quot;&gt;Есть другой  вариант:&lt;/p&gt;
  &lt;pre id=&quot;5tk2&quot;&gt;&amp;gt; $ docker inspect --format=&amp;#x27;{{json .}}&amp;#x27;  dbe556947aef&lt;/pre&gt;
  &lt;p id=&quot;br7o&quot;&gt;Такой вывод будет в виде JSON, который можно обработать через jq:&lt;/p&gt;
  &lt;pre id=&quot;w3Fx&quot;&gt;&amp;gt; $ docker inspect --format=&amp;#x27;{{json .}}&amp;#x27;  antipy_postgres_test | jq .Id
&amp;quot;dbe556947aefcc8f02e195a903a3e894a3ca532952ce373a47708b552cef7d71&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;uJfK&quot;&gt;Но еще удобнее прсить запрос сразу же в команде docker inspect:&lt;/p&gt;
  &lt;pre id=&quot;lJg5&quot;&gt;&amp;gt; $ docker inspect --format=&amp;#x27;{{json .Config.Labels.maintainer}}&amp;#x27;  dbe556947aef
&amp;quot;PostGIS Project - https://postgis.net&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;C9nW&quot;&gt;Но есть проблема, если ключ содержить побелы или точки в имени, то такой подход не сработает, например если мы попытаемся забрать значение &amp;quot;com.docker.compose.config-hash&amp;quot; из &lt;br /&gt;.Config.Labels.maintainer.&amp;quot;com.docker.compose.config-hash&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;bA3K&quot;&gt;&amp;gt; $ docker inspect --format=&amp;#x27;{{json .Config.Labels.com.docker.compose.config-hash}}&amp;#x27;  dbe556947aef                                                                                                                  
template parsing error: template: :1: bad character U+002D &amp;#x27;-&amp;#x27;

&amp;gt; $ docker inspect --format=&amp;#x27;{{json .Config.Labels.[&amp;quot;com.docker.compose.config-hash&amp;quot;]}}&amp;#x27;  dbe556947aef                                                                                                              
template parsing error: template: :1: bad character U+005B &amp;#x27;[&amp;#x27;&lt;/pre&gt;
  &lt;p id=&quot;UdAX&quot;&gt;Решение: Использовать в таких случаях index:&lt;/p&gt;
  &lt;pre id=&quot;V6mo&quot;&gt;&amp;gt; $ docker inspect dbe556947aef -f &amp;#x27;{{index .Config.Labels &amp;quot;com.docker.compose.config-hash&amp;quot;}}&amp;#x27;                                                                                                                      
4ee3f97c83ef9c92e29b809eac2ac70aa53bbf0862c01da9c258580428aecd99&lt;/pre&gt;
  &lt;p id=&quot;vKHP&quot;&gt;Подробнее обо всех способах вывода в Docker:&lt;/p&gt;
  &lt;p id=&quot;TzCQ&quot;&gt;&lt;a href=&quot;https://docs.docker.com/config/formatting/&quot; target=&quot;_blank&quot;&gt;https://docs.docker.com/config/formatting/&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>benderinoz:gitlab-update-in-docker</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/gitlab-update-in-docker?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Обновление GitLab в docker</title><published>2023-05-29T08:28:25.710Z</published><updated>2023-05-29T08:28:25.710Z</updated><category term="gitlab" label="gitlab"></category><summary type="html">Официальная документация по обновлению  GitLab:</summary><content type="html">
  &lt;p id=&quot;OfFq&quot;&gt;Официальная документация по обновлению  GitLab:&lt;/p&gt;
  &lt;p id=&quot;01ZG&quot;&gt;&lt;a href=&quot;https://docs.gitlab.com/ee/update/&quot; target=&quot;_blank&quot;&gt;https://docs.gitlab.com/ee/update/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;RETK&quot;&gt;Обновлять можно только в строгой последовательности как описано здесь:&lt;/p&gt;
  &lt;p id=&quot;MUKj&quot;&gt;&lt;a href=&quot;https://docs.gitlab.com/ee/update/#upgrade-paths&quot; target=&quot;_blank&quot;&gt;https://docs.gitlab.com/ee/update/#upgrade-paths&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;agEx&quot;&gt;Существует онлайн сервис для автоматического просчета шагов обновления, раньше она работула здесь:&lt;/p&gt;
  &lt;p id=&quot;f25L&quot;&gt;&lt;a href=&quot;https://gitlab-com.gitlab.io/support/toolbox/upgrade-path&quot; target=&quot;_blank&quot;&gt;https://gitlab-com.gitlab.io/support/toolbox/upgrade-path&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;d6aO&quot;&gt;но сейча снедоступна. Имеется исходный код этой утилиты для локального запуска:&lt;/p&gt;
  &lt;p id=&quot;XIDZ&quot;&gt;&lt;a href=&quot;https://gitlab.com/gitlab-com/support/toolbox/upgrade-path&quot; target=&quot;_blank&quot;&gt;https://gitlab.com/gitlab-com/support/toolbox/upgrade-path&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;rQJ2&quot;&gt;В ней выбираем исходную версию на текущий момент и конечную, которую мы хотим получить после обновления, после чго получим пошаково версии апгрейда.&lt;/p&gt;
  &lt;h2 id=&quot;ac29&quot;&gt;Полезные команды, которые надо запускать внутри контейнера с gitlab:&lt;/h2&gt;
  &lt;h3 id=&quot;mdmR&quot;&gt;Перед началом апгрейда (перед заменой образа на новый) обязательно нужно проверить не запущены ли фоновые миграции&lt;/h3&gt;
  &lt;pre id=&quot;tboH&quot;&gt;gitlab-rails runner -e production &amp;#x27;puts Gitlab::BackgroundMigration.remaining&amp;#x27;
gitlab-rails runner -e production &amp;#x27;puts Gitlab::Database::BackgroundMigrationJob.pending.count&amp;#x27;&lt;/pre&gt;
  &lt;p id=&quot;28vI&quot;&gt;Если контейнер падает с permission ошибками, следует запустить утилиту фикации:&lt;/p&gt;
  &lt;p id=&quot;9KQb&quot;&gt;&lt;code&gt;update-permissions&lt;/code&gt; - обновить права на все файлы и папки, бывает полезно если по ошибке сменились права на некоторые каталоги&lt;/p&gt;
  &lt;p id=&quot;us0C&quot;&gt;&lt;code&gt;gitlab-ctl reconfigure &lt;/code&gt;- переконфигурировать гитлаб. При этом данные не удаляются, а лишь перепроверяются конфиги и считываются заново&lt;/p&gt;
  &lt;p id=&quot;FcxR&quot;&gt;&lt;code&gt;gitlab-rake gitlab:env:info&lt;/code&gt; и &lt;code&gt;gitlab-rake gitlab:check&lt;/code&gt; - проверить состояние запущенной системы&lt;/p&gt;

</content></entry><entry><id>benderinoz:bash-filtering</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/bash-filtering?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Bash шаблоны фильтрации</title><published>2023-05-15T08:03:21.318Z</published><updated>2023-05-15T08:03:21.318Z</updated><category term="bash" label="bash"></category><summary type="html">Эти оболочки POSIX используют четыре различных шаблона фильтрации:</summary><content type="html">
  &lt;p id=&quot;CSrp&quot;&gt;Эти оболочки POSIX используют четыре различных шаблона фильтрации:&lt;/p&gt;
  &lt;ul id=&quot;qaYa&quot;&gt;
    &lt;li id=&quot;DMfH&quot;&gt;&lt;code&gt;${var#pattern}&lt;/code&gt;- Удаляет наименьшую строку с левой стороны, соответствующую шаблону.&lt;/li&gt;
    &lt;li id=&quot;R9Ya&quot;&gt;&lt;code&gt;${var##pattern}&lt;/code&gt;- Удаляет самую большую строку с левой стороны, соответствующую шаблону.&lt;/li&gt;
    &lt;li id=&quot;lQbZ&quot;&gt;&lt;code&gt;${var%pattern}&lt;/code&gt;- Удаляет наименьшую строку с правой стороны, соответствующую шаблону.&lt;/li&gt;
    &lt;li id=&quot;0zV0&quot;&gt;&lt;code&gt;${var%%pattern}&lt;/code&gt;- Удаляет самую большую строку с правой стороны, соответствующую шаблону.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;hVzh&quot;&gt;Вот несколько примеров:&lt;/p&gt;
  &lt;pre id=&quot;hvzo&quot;&gt;foo=&amp;quot;foo-bar-foobar&amp;quot;
echo ${foo#*-}   # echoes &amp;#x27;bar-foobar&amp;#x27;  (Removes &amp;#x27;foo-&amp;#x27; because that matches &amp;#x27;*-&amp;#x27;)
echo ${foo##*-}  # echoes &amp;#x27;foobar&amp;#x27; (Removes &amp;#x27;foo-bar-&amp;#x27;)
echo ${foo%-*}   # echoes &amp;#x27;foo-bar&amp;#x27;
echo ${foo%%-*}  # echoes &amp;#x27;foo&amp;#x27;&lt;/pre&gt;

</content></entry><entry><id>benderinoz:tls-cert-generation</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/tls-cert-generation?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Генерация самоподписанного сертификата</title><published>2023-02-14T09:25:31.142Z</published><updated>2023-05-15T08:09:01.749Z</updated><category term="ssl" label="SSL"></category><summary type="html">sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt</summary><content type="html">
  &lt;p id=&quot;VoKa&quot;&gt;&lt;code&gt;sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;bww4&quot;&gt;При использовании OpenSSL нужно также создать ключи Диффи-Хеллмана, которые нужны для поддержки PFS:&lt;/p&gt;
  &lt;p id=&quot;1wLe&quot;&gt;&lt;code&gt;openssl dhparam -out dhparams.pem 4096&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QU0v&quot;&gt;Источник: &lt;a href=&quot;https://www.8host.com/blog/sozdanie-samopodpisannogo-ssl-sertifikata-dlya-nginx-v-ubuntu-16-04/&quot; target=&quot;_blank&quot;&gt;https://www.8host.com/blog/sozdanie-samopodpisannogo-ssl-sertifikata-dlya-nginx-v-ubuntu-16-04/&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;FoRM&quot;&gt;UPD: лучше использовать вариант ниже, с автогенерацией и использованием собственного центра сертификации:&lt;/h2&gt;
  &lt;pre id=&quot;lwFH&quot;&gt;#!/bin/bash

if [ -z &amp;quot;$1&amp;quot; ]
then
  echo &amp;quot;Please enter domain name and ip address to create a certificate for&amp;quot;;
  echo &amp;quot;e.g. domain.local 192.168.1.1&amp;quot;
  exit;
fi

if [ -z &amp;quot;$2&amp;quot; ]
then
  echo &amp;quot;Please enter domain name and ip address to create a certificate for&amp;quot;;
  echo &amp;quot;e.g. domain.local 192.168.1.1&amp;quot;
  exit;
fi

COMMON_NAME=$1
COMMON_IP=$2

# # генерируем закрытый ключ центра сертификации
openssl genrsa -out rootCA.key 2048
# # генерируем сертификат центра сертификации
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -subj &amp;quot;/C=CA/ST=None/L=NB/O=None/CN=domain.local&amp;quot; -out rootCA.pem
# C=CA    # Country Name
# ST=None # State or Province Name (full name)
# L=NB    # Locality Name (eg, city)
# O=None  # Organization Name (eg, company)
# CN=domain.local #Common Name (e.g. server FQDN or YOUR name)


if [ -f $COMMON_NAME.key ]; then
  KEY_OPT=&amp;quot;-key&amp;quot;
else
  KEY_OPT=&amp;quot;-keyout&amp;quot;
fi

&amp;gt;$COMMON_NAME.ext cat &amp;lt;&amp;lt;-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = $COMMON_NAME 
DNS.2 = www.$COMMON_NAME 
IP.1 = $COMMON_IP
EOF

SUBJECT=&amp;quot;/C=RU/ST=None/L=Moscow/O=Kaspersky/CN=$COMMON_NAME&amp;quot;
NUM_OF_DAYS=999

# Сформируем csr файл
openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT $COMMON_NAME.key -subj &amp;quot;$SUBJECT&amp;quot; -out $COMMON_NAME.csr

# Выпускаем сертификат:
openssl x509 -req -in $COMMON_NAME.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out $COMMON_NAME.crt -days $NUM_OF_DAYS -sha256 -extfile $COMMON_NAME.ext
rm $COMMON_NAME.ext

# Сконвертировать pem в pfx для Windows:
openssl pkcs12 -export -out rootCA.pfx -inkey rootCA.key -in rootCA.pem -password pass:
&lt;/pre&gt;

</content></entry><entry><id>benderinoz:docker-system-folder</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/docker-system-folder?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Перенос системных файлов Docker в другой каталог</title><published>2023-02-06T14:59:58.499Z</published><updated>2023-05-15T08:05:06.867Z</updated><category term="docker" label="docker"></category><summary type="html">Путь по умолчанию для хранения файлов Docker находится в /var/lib/docker, но можно переместить эти файлы, к примеру, на raid массив. В моем примере это путь /mnt/raid1/docker</summary><content type="html">
  &lt;p id=&quot;MSaU&quot;&gt;Путь по умолчанию для хранения файлов Docker находится в&lt;code&gt; /var/lib/docker,&lt;/code&gt; но можно переместить эти файлы, к примеру, на raid массив. В моем примере это путь &lt;code&gt;/mnt/raid1/docker&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;VzIe&quot;&gt;Для начала останавливаем сервис и сокет докера&lt;/h3&gt;
  &lt;pre id=&quot;xVwH&quot; data-lang=&quot;bash&quot;&gt;sudo systemctl stop docker.service
sudo systemctl stop docker.socket&lt;/pre&gt;
  &lt;h3 id=&quot;Zfx0&quot;&gt;Создаем файл (если он еще не был создан)&lt;/h3&gt;
  &lt;p id=&quot;xkv6&quot;&gt;&lt;code&gt;sudo vim /etc/docker/daemon.json&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;H4mc&quot;&gt;Вносим в него такие изменения:&lt;/h3&gt;
  &lt;pre id=&quot;sB6i&quot; data-lang=&quot;bash&quot;&gt;{
    &amp;quot;data-root&amp;quot;: &amp;quot;/mnt/raid1/docker&amp;quot;
}&lt;/pre&gt;
  &lt;h3 id=&quot;uuN2&quot;&gt;Теперь нужно скопировать все файлы из старого каталога в новый, с сохранением прав&lt;/h3&gt;
  &lt;pre id=&quot;U82r&quot; data-lang=&quot;bash&quot;&gt;sudo rsync -ahv /var/lib/docker/ /mnt/raid1/docker/&lt;/pre&gt;
  &lt;h3 id=&quot;94dx&quot;&gt;Делаем daemon-reload и запускаем docker&lt;/h3&gt;
  &lt;pre id=&quot;xur7&quot; data-lang=&quot;bash&quot;&gt;sudo systemctl daemon-reload
sudo systemctl restart docker&lt;/pre&gt;
  &lt;h3 id=&quot;fA5n&quot;&gt;После удачного запуска проверяем фактический путь хранения данных докер на примере volume&amp;#x27;ов:&lt;/h3&gt;
  &lt;pre id=&quot;IIHI&quot; data-lang=&quot;bash&quot;&gt;$ docker volume ls
DRIVER    VOLUME NAME
local     0000c1c24079fb673a4572d8ddc29700fa14...
local     1ae637e8a588a87e5d57d7293d197ac9eefd...


$ docker volume inspect 0000c1c24079fb673a4572d8ddc29700fa14...
[
    {
        &amp;quot;CreatedAt&amp;quot;: &amp;quot;2023-02-06T17:43:21+03:00&amp;quot;,
        &amp;quot;Driver&amp;quot;: &amp;quot;local&amp;quot;,
        &amp;quot;Labels&amp;quot;: null,
        &amp;quot;Mountpoint&amp;quot;: &amp;quot;/mnt/raid1/docker/volumes/0000c1c24079fb673a4572d8ddc29700fa14.../_data&amp;quot;,
        &amp;quot;Name&amp;quot;: &amp;quot;0000c1c24079fb673a4572d8ddc29700fa14...&amp;quot;,
        &amp;quot;Options&amp;quot;: null,
        &amp;quot;Scope&amp;quot;: &amp;quot;local&amp;quot;
    }
]&lt;/pre&gt;
  &lt;h3 id=&quot;JMXs&quot;&gt;Как видим Mountpoint изменился, теперь можно удалить или переименовать старую директорию хранения файлов докера&lt;/h3&gt;
  &lt;pre id=&quot;L5r2&quot; data-lang=&quot;bash&quot;&gt;sudo rm -rf /var/lib/docker&lt;/pre&gt;

</content></entry><entry><id>benderinoz:ssh-tunnels</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/ssh-tunnels?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>Настройка SSH туннеля без доступа к SHELL и без VPN</title><published>2023-02-03T14:42:11.251Z</published><updated>2023-05-15T08:04:48.394Z</updated><category term="ssh" label="ssh"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/bd/17/bd176aa2-dae2-44f5-a920-ed2f01d6ec60.jpeg&quot;&gt;Имеем ПК в собственной ЛВС ip_pc1 за натом, , сервер в DMZ (ip_server), ПК клиента ip_other тоже за натом. </summary><content type="html">
  &lt;h2 id=&quot;aPSA&quot;&gt;Исходные данные:&lt;/h2&gt;
  &lt;p id=&quot;Ndki&quot;&gt;Имеем ПК в собственной ЛВС&lt;strong&gt; ip_pc1 &lt;/strong&gt;за натом, , сервер в DMZ (&lt;strong&gt;ip_server&lt;/strong&gt;), ПК клиента &lt;strong&gt;ip_other&lt;/strong&gt; тоже за натом. &lt;/p&gt;
  &lt;p id=&quot;Vcrf&quot;&gt;Собственная ЛВС закрыта фаерволом, доступ можно получить только изнутри до сервера &lt;strong&gt;ip_server&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;PtaI&quot;&gt;Цель:&lt;/h2&gt;
  &lt;p id=&quot;yv3m&quot;&gt;Получить доступ по SSH с &lt;code&gt;ip_pc1&lt;/code&gt; до &lt;code&gt;ip_other&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;7uQ0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bd/17/bd176aa2-dae2-44f5-a920-ed2f01d6ec60.jpeg&quot; width=&quot;638&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;MEUk&quot;&gt;Процесс настройки:&lt;/h2&gt;
  &lt;h3 id=&quot;Xiom&quot;&gt;На сервере &lt;strong&gt;ip_server&lt;/strong&gt; создаем нового пользователя:&lt;/h3&gt;
  &lt;p id=&quot;HZ2K&quot;&gt;&lt;code&gt;useradd -m -s /bin/false -g nogroup -G nogroup user&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ps9j&quot;&gt;-m - Create the user&amp;#x27;s home directory if it does not exist  &lt;br /&gt;-s - The name of the user&amp;#x27;s login shell.  &lt;br /&gt;-g - The group name or number of the user&amp;#x27;s initial login group.  &lt;br /&gt;-G - A list of supplementary groups which the user is also a member of.&lt;/p&gt;
  &lt;h3 id=&quot;eDg8&quot;&gt;Задаем новому пользователю пароль:&lt;/h3&gt;
  &lt;p id=&quot;eOjn&quot;&gt;&lt;code&gt;sudo passwd user&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;rXfd&quot;&gt;Логинимся под пользователем, генерируем пару ключей&lt;/h3&gt;
  &lt;p id=&quot;cJjW&quot;&gt;&lt;code&gt;su user  &lt;br /&gt;cd ~  &lt;br /&gt;ssh-keygen&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;9Ukr&quot;&gt;Создаем файл ~/.ssh/authorized_keys и добавляем в него следующие строки:&lt;/h3&gt;
  &lt;p id=&quot;RKh9&quot;&gt;&lt;code&gt;command=&amp;quot;read a; exit&amp;quot;,no-agent-forwarding,no-X11-forwarding,no-user-rc ssh-rsa &amp;lt;&amp;lt;здесь вставляем только что созданный публичный ключ&amp;gt;&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5Kas&quot;&gt;&lt;strong&gt;где:  &lt;/strong&gt;&lt;br /&gt;&lt;code&gt;command=&amp;quot;read a; exit&amp;quot;&lt;/code&gt; - позволяет при поднятии соединения закрыть доступ к shell. При нажатии любой клавиши будет выполнен exit.  &lt;br /&gt;&lt;code&gt;no-agent-forwarding,no-X11-forwarding,no-user-rc&lt;/code&gt; - запрещаем любые другие возможности пользователя&lt;/p&gt;
  &lt;h3 id=&quot;huYq&quot;&gt;Закрытый ключ передаем клиенту&lt;/h3&gt;
  &lt;h3 id=&quot;ptck&quot;&gt;Клиент на своей машине подключается к нашему серверу:&lt;/h3&gt;
  &lt;p id=&quot;h5pu&quot;&gt;&lt;code&gt;sh -R 4897:localhost:22 user@server&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1bgO&quot;&gt;&lt;strong&gt;где:  &lt;/strong&gt;&lt;br /&gt;22 - порт ssh который слушает машина клиента&lt;br /&gt;4897 - порт перенаправления на наш сервер, можно выбрать любой другой&lt;/p&gt;
  &lt;h3 id=&quot;8ZeW&quot;&gt;На собственном пк подключаемся к серверу:&lt;/h3&gt;
  &lt;p id=&quot;iTj7&quot;&gt;&lt;code&gt;ssh -L 2222:localhost:4897 user@server&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;S798&quot;&gt;&lt;strong&gt;где:  &lt;/strong&gt;&lt;br /&gt;2222 - порт куда мы будем коннектится по SSH  &lt;br /&gt;4897 - порт должен совпадать с портом перенаправления на наш сервер из прошлого шага (с него забираем туннель)&lt;/p&gt;
  &lt;h3 id=&quot;OyN1&quot;&gt;Теперь на нашем пк открываем новый терминал и можем войти на ПК клиента:&lt;/h3&gt;
  &lt;p id=&quot;0IW4&quot;&gt;&lt;code&gt;ssh -o &amp;quot;StrictHostKeyChecking=no&amp;quot; -p 2222 -i id_rsa_client another_user@localhost&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XeFY&quot;&gt;Где:  &lt;br /&gt;&lt;code&gt;-o &amp;quot;StrictHostKeyChecking=no&amp;quot;&lt;/code&gt; - отключает проверку публичного ключа тачки, куда мы подключаемся, т.к. это всегда будет localhost  &lt;br /&gt;&lt;code&gt;-p 2222&lt;/code&gt; принудительно указываем порт для подключения  &lt;br /&gt;&lt;code&gt;-i id_rsa_client&lt;/code&gt; путь до закрытого ключа для подключения к клиенту (может отсутствовать при авторизации по паролю)  &lt;br /&gt;&lt;code&gt;another_user@localhost &lt;/code&gt;- пользователь &lt;code&gt;another_user&lt;/code&gt; должен существовать на ПК &lt;strong&gt;ip_other,&lt;/strong&gt; адрес сервера localhost, т.к. подключаемся через открытый порт на своей машине.&lt;/p&gt;
  &lt;h3 id=&quot;Ij9d&quot;&gt;Готово!&lt;/h3&gt;
  &lt;h3 id=&quot;QlVL&quot;&gt;Посмотреть активные туннели можно командой:&lt;/h3&gt;
  &lt;p id=&quot;f4Qt&quot;&gt;&lt;code&gt;sudo lsof -i -n | egrep &amp;#x27;\&amp;lt;ssh\&amp;gt;&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Ck7j&quot;&gt;Что-бы принудительно отключить сессию (и все процессы) пользователя, на сервере выполнить:&lt;/h3&gt;
  &lt;p id=&quot;uAKi&quot;&gt;&lt;code&gt;pkill -u username&lt;/code&gt;&lt;/p&gt;

</content></entry><entry><id>benderinoz:ssh-tips</id><link rel="alternate" type="text/html" href="https://teletype.in/@benderinoz/ssh-tips?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=benderinoz"></link><title>SSH tips</title><published>2023-02-03T14:27:06.633Z</published><updated>2023-05-15T08:03:58.914Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/af/d3/afd3cc05-692e-4985-b6b1-addbf36343f9.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/44/30/44305623-9e49-4684-b7b4-55dd10f630ee.png&quot;&gt;ssh -o PreferredAuthentications=password username@11.22.33.44</summary><content type="html">
  &lt;h2 id=&quot;oI4O&quot;&gt;&lt;strong&gt;Авторизация по ssh принудительно по паролю&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;8PCo&quot;&gt;ssh -o PreferredAuthentications=password username@11.22.33.44&lt;/p&gt;
  &lt;p id=&quot;KW3I&quot;&gt;Что-бы указать эту опцию для всех подключений пользователя, добавляем в файл &lt;/p&gt;
  &lt;p id=&quot;Hz03&quot;&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;HjEU&quot;&gt;Host *
        IdentitiesOnly=yes&lt;/pre&gt;
  &lt;h2 id=&quot;tZuS&quot;&gt;Проброс портов&lt;/h2&gt;
  &lt;p id=&quot;2e5J&quot;&gt;Пробросить все порты за сервером к себе, тем самым подняв socks proxy&lt;/p&gt;
  &lt;p id=&quot;baVc&quot;&gt;&lt;code&gt;ssh -D localhost:1080 remote-server-ip&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;VKsl&quot;&gt;Далее в firefox в разделе proxy указываем настройки:&lt;/p&gt;
  &lt;figure id=&quot;iZ2C&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/44/30/44305623-9e49-4684-b7b4-55dd10f630ee.png&quot; width=&quot;749&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;BSor&quot;&gt;После этого в браузере можем открывать любые веб адреса, доступные с удаленного сервера&lt;/p&gt;
  &lt;h2 id=&quot;6rbg&quot;&gt;Проброс удаленного порта к себе&lt;/h2&gt;
  &lt;p id=&quot;t96W&quot;&gt;Например, мы имеем удаленный сервер &lt;strong&gt;remote_server&lt;/strong&gt;, у которого на &lt;strong&gt;127.0.0.1&lt;/strong&gt;:5432 запущен postgresql, мы хотим пробросить этот порт к себе для локального подключения\тестирования БД.&lt;/p&gt;
  &lt;p id=&quot;HqkG&quot;&gt;&lt;code&gt;ssh -L 6543:&lt;strong&gt;127.0.0.1&lt;/strong&gt;:5432 remote_server&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;cu4Q&quot;&gt;После этого мы можем подключиться к порту 6543 на локальной машине и попадем на порт 5432 удаленного сервера.&lt;/p&gt;
  &lt;p id=&quot;r5rc&quot;&gt;Та же самая команда используется если надо добраться до третьего хоста, который доступен только за remote_server&lt;/p&gt;
  &lt;p id=&quot;rUUC&quot;&gt;localhost &amp;lt;--&amp;gt; remote_server &amp;lt;--&amp;gt; third_server:8080&lt;/p&gt;
  &lt;p id=&quot;9Ldu&quot;&gt;&lt;code&gt;ssh -L 8181:third_server:8080 remote_server&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zKyY&quot;&gt;Теперь обратившись на 127.0.0.1:8181 мы попадем на third_server:8080&lt;/p&gt;
  &lt;h2 id=&quot;dsXf&quot;&gt;Проброс своего порта на удаленный сервер&lt;/h2&gt;
  &lt;p id=&quot;94FW&quot;&gt;Аналогично предыдущему примеру, только порт мы пробрасываем со своего хоста на удаленный&lt;/p&gt;
  &lt;p id=&quot;b4C6&quot;&gt;&lt;code&gt;ssh -R 6543:localhost:5432 remote_server&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;J8Ca&quot;&gt;В данном примере порт 5432 с локальной машины был проброшен на порт 6543 удаленного сервера&lt;/p&gt;

</content></entry></feed>