<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>@benderinoz</title><generator>teletype.in</generator><description><![CDATA[@benderinoz]]></description><link>https://teletype.in/@benderinoz?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/benderinoz?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/benderinoz?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 03 Jun 2026 18:58:38 GMT</pubDate><lastBuildDate>Wed, 03 Jun 2026 18:58:38 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@benderinoz/kubernetes-tips</guid><link>https://teletype.in/@benderinoz/kubernetes-tips?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/kubernetes-tips?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>K8S Tips</title><pubDate>Sat, 04 Nov 2023 17:08:07 GMT</pubDate><category>docker</category><description><![CDATA[Kubernetes tips]]></description><content:encoded><![CDATA[
  <p id="aG1d">Reference (Bookmark this page for exam. It will be very handy):</p>
  <p id="gRbo"><a href="https://kubernetes.io/docs/reference/kubectl/conventions/" target="_blank">https://kubernetes.io/docs/reference/kubectl/conventions/</a></p>
  <p id="I9ZV"><strong>Create an NGINX Pod</strong></p>
  <p id="V65j"><code>kubectl run nginx --image=nginx</code></p>
  <p id="VoEo"><strong>Generate POD Manifest YAML file (-o yaml). Don&#x27;t create it(--dry-run)</strong></p>
  <p id="pmHQ"><code>kubectl run nginx --image=nginx --dry-run=client -o yaml</code></p>
  <p id="6fUS"><strong>Create a deployment</strong></p>
  <p id="DIpL"><code>kubectl create deployment --image=nginx nginx</code></p>
  <p id="JA36"><strong>Generate Deployment YAML file (-o yaml). Don&#x27;t create it(--dry-run)</strong></p>
  <p id="IUyr"><code>kubectl create deployment --image=nginx nginx --dry-run=client -o yaml</code></p>
  <p id="OnSY"><strong>Generate Deployment YAML file (-o yaml). Don’t create it(–dry-run) and save it to a file.</strong></p>
  <p id="18Ns"><code>kubectl create deployment --image=nginx nginx --dry-run=client -o yaml &gt; nginx-deployment.yaml</code></p>
  <p id="Ofn6"><strong>Make necessary changes to the file (for example, adding more replicas) and then create the deployment.</strong></p>
  <p id="dcHG"><code>kubectl create -f nginx-deployment.yaml</code></p>
  <p id="KVV7"><strong>Просмотр подов по метке label</strong></p>
  <pre id="7CG3">kubectl get pods -l app=myapp</pre>

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@benderinoz/docker-inspect-parsing</guid><link>https://teletype.in/@benderinoz/docker-inspect-parsing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/docker-inspect-parsing?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>Docker -  форматированный вывод информации о контейнерах</title><pubDate>Mon, 21 Aug 2023 11:23:44 GMT</pubDate><category>docker</category><description><![CDATA[Обычный вывод о запущенном контейнере:]]></description><content:encoded><![CDATA[
  <p id="pwuY">Обычный вывод о запущенном контейнере:</p>
  <pre id="YArS">&gt; $ docker inspect dbe556947aef</pre>
  <p id="vOPw">Такая команда выведет вс информацию в stdout</p>
  <p id="EN7t">Есть другой  вариант:</p>
  <pre id="5tk2">&gt; $ docker inspect --format=&#x27;{{json .}}&#x27;  dbe556947aef</pre>
  <p id="br7o">Такой вывод будет в виде JSON, который можно обработать через jq:</p>
  <pre id="w3Fx">&gt; $ docker inspect --format=&#x27;{{json .}}&#x27;  antipy_postgres_test | jq .Id
&quot;dbe556947aefcc8f02e195a903a3e894a3ca532952ce373a47708b552cef7d71&quot;</pre>
  <p id="uJfK">Но еще удобнее прсить запрос сразу же в команде docker inspect:</p>
  <pre id="lJg5">&gt; $ docker inspect --format=&#x27;{{json .Config.Labels.maintainer}}&#x27;  dbe556947aef
&quot;PostGIS Project - https://postgis.net&quot;</pre>
  <p id="C9nW">Но есть проблема, если ключ содержить побелы или точки в имени, то такой подход не сработает, например если мы попытаемся забрать значение &quot;com.docker.compose.config-hash&quot; из <br />.Config.Labels.maintainer.&quot;com.docker.compose.config-hash&quot;:</p>
  <pre id="bA3K">&gt; $ docker inspect --format=&#x27;{{json .Config.Labels.com.docker.compose.config-hash}}&#x27;  dbe556947aef                                                                                                                  
template parsing error: template: :1: bad character U+002D &#x27;-&#x27;

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@benderinoz/gitlab-update-in-docker</guid><link>https://teletype.in/@benderinoz/gitlab-update-in-docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/gitlab-update-in-docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>Обновление GitLab в docker</title><pubDate>Mon, 29 May 2023 08:28:25 GMT</pubDate><category>gitlab</category><description><![CDATA[Официальная документация по обновлению  GitLab:]]></description><content:encoded><![CDATA[
  <p id="OfFq">Официальная документация по обновлению  GitLab:</p>
  <p id="01ZG"><a href="https://docs.gitlab.com/ee/update/" target="_blank">https://docs.gitlab.com/ee/update/</a></p>
  <p id="RETK">Обновлять можно только в строгой последовательности как описано здесь:</p>
  <p id="MUKj"><a href="https://docs.gitlab.com/ee/update/#upgrade-paths" target="_blank">https://docs.gitlab.com/ee/update/#upgrade-paths</a></p>
  <p id="agEx">Существует онлайн сервис для автоматического просчета шагов обновления, раньше она работула здесь:</p>
  <p id="f25L"><a href="https://gitlab-com.gitlab.io/support/toolbox/upgrade-path" target="_blank">https://gitlab-com.gitlab.io/support/toolbox/upgrade-path</a></p>
  <p id="d6aO">но сейча снедоступна. Имеется исходный код этой утилиты для локального запуска:</p>
  <p id="XIDZ"><a href="https://gitlab.com/gitlab-com/support/toolbox/upgrade-path" target="_blank">https://gitlab.com/gitlab-com/support/toolbox/upgrade-path</a></p>
  <p id="rQJ2">В ней выбираем исходную версию на текущий момент и конечную, которую мы хотим получить после обновления, после чго получим пошаково версии апгрейда.</p>
  <h2 id="ac29">Полезные команды, которые надо запускать внутри контейнера с gitlab:</h2>
  <h3 id="mdmR">Перед началом апгрейда (перед заменой образа на новый) обязательно нужно проверить не запущены ли фоновые миграции</h3>
  <pre id="tboH">gitlab-rails runner -e production &#x27;puts Gitlab::BackgroundMigration.remaining&#x27;
gitlab-rails runner -e production &#x27;puts Gitlab::Database::BackgroundMigrationJob.pending.count&#x27;</pre>
  <p id="28vI">Если контейнер падает с permission ошибками, следует запустить утилиту фикации:</p>
  <p id="9KQb"><code>update-permissions</code> - обновить права на все файлы и папки, бывает полезно если по ошибке сменились права на некоторые каталоги</p>
  <p id="us0C"><code>gitlab-ctl reconfigure </code>- переконфигурировать гитлаб. При этом данные не удаляются, а лишь перепроверяются конфиги и считываются заново</p>
  <p id="FcxR"><code>gitlab-rake gitlab:env:info</code> и <code>gitlab-rake gitlab:check</code> - проверить состояние запущенной системы</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@benderinoz/bash-filtering</guid><link>https://teletype.in/@benderinoz/bash-filtering?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/bash-filtering?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>Bash шаблоны фильтрации</title><pubDate>Mon, 15 May 2023 08:03:21 GMT</pubDate><category>bash</category><description><![CDATA[Эти оболочки POSIX используют четыре различных шаблона фильтрации:]]></description><content:encoded><![CDATA[
  <p id="CSrp">Эти оболочки POSIX используют четыре различных шаблона фильтрации:</p>
  <ul id="qaYa">
    <li id="DMfH"><code>${var#pattern}</code>- Удаляет наименьшую строку с левой стороны, соответствующую шаблону.</li>
    <li id="R9Ya"><code>${var##pattern}</code>- Удаляет самую большую строку с левой стороны, соответствующую шаблону.</li>
    <li id="lQbZ"><code>${var%pattern}</code>- Удаляет наименьшую строку с правой стороны, соответствующую шаблону.</li>
    <li id="0zV0"><code>${var%%pattern}</code>- Удаляет самую большую строку с правой стороны, соответствующую шаблону.</li>
  </ul>
  <p id="hVzh">Вот несколько примеров:</p>
  <pre id="hvzo">foo=&quot;foo-bar-foobar&quot;
echo ${foo#*-}   # echoes &#x27;bar-foobar&#x27;  (Removes &#x27;foo-&#x27; because that matches &#x27;*-&#x27;)
echo ${foo##*-}  # echoes &#x27;foobar&#x27; (Removes &#x27;foo-bar-&#x27;)
echo ${foo%-*}   # echoes &#x27;foo-bar&#x27;
echo ${foo%%-*}  # echoes &#x27;foo&#x27;</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@benderinoz/tls-cert-generation</guid><link>https://teletype.in/@benderinoz/tls-cert-generation?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/tls-cert-generation?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>Генерация самоподписанного сертификата</title><pubDate>Tue, 14 Feb 2023 09:25:31 GMT</pubDate><category>SSL</category><description><![CDATA[sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt]]></description><content:encoded><![CDATA[
  <p id="VoKa"><code>sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt</code></p>
  <p id="bww4">При использовании OpenSSL нужно также создать ключи Диффи-Хеллмана, которые нужны для поддержки PFS:</p>
  <p id="1wLe"><code>openssl dhparam -out dhparams.pem 4096</code></p>
  <p id="QU0v">Источник: <a href="https://www.8host.com/blog/sozdanie-samopodpisannogo-ssl-sertifikata-dlya-nginx-v-ubuntu-16-04/" target="_blank">https://www.8host.com/blog/sozdanie-samopodpisannogo-ssl-sertifikata-dlya-nginx-v-ubuntu-16-04/</a></p>
  <h2 id="FoRM">UPD: лучше использовать вариант ниже, с автогенерацией и использованием собственного центра сертификации:</h2>
  <pre id="lwFH">#!/bin/bash

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

if [ -z &quot;$2&quot; ]
then
  echo &quot;Please enter domain name and ip address to create a certificate for&quot;;
  echo &quot;e.g. domain.local 192.168.1.1&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 &quot;/C=CA/ST=None/L=NB/O=None/CN=domain.local&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=&quot;-key&quot;
else
  KEY_OPT=&quot;-keyout&quot;
fi

&gt;$COMMON_NAME.ext cat &lt;&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=&quot;/C=RU/ST=None/L=Moscow/O=Kaspersky/CN=$COMMON_NAME&quot;
NUM_OF_DAYS=999

# Сформируем csr файл
openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT $COMMON_NAME.key -subj &quot;$SUBJECT&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:
</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@benderinoz/docker-system-folder</guid><link>https://teletype.in/@benderinoz/docker-system-folder?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/docker-system-folder?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>Перенос системных файлов Docker в другой каталог</title><pubDate>Mon, 06 Feb 2023 14:59:58 GMT</pubDate><category>docker</category><description><![CDATA[Путь по умолчанию для хранения файлов Docker находится в /var/lib/docker, но можно переместить эти файлы, к примеру, на raid массив. В моем примере это путь /mnt/raid1/docker]]></description><content:encoded><![CDATA[
  <p id="MSaU">Путь по умолчанию для хранения файлов Docker находится в<code> /var/lib/docker,</code> но можно переместить эти файлы, к примеру, на raid массив. В моем примере это путь <code>/mnt/raid1/docker</code></p>
  <h3 id="VzIe">Для начала останавливаем сервис и сокет докера</h3>
  <pre id="xVwH" data-lang="bash">sudo systemctl stop docker.service
sudo systemctl stop docker.socket</pre>
  <h3 id="Zfx0">Создаем файл (если он еще не был создан)</h3>
  <p id="xkv6"><code>sudo vim /etc/docker/daemon.json</code></p>
  <h3 id="H4mc">Вносим в него такие изменения:</h3>
  <pre id="sB6i" data-lang="bash">{
    &quot;data-root&quot;: &quot;/mnt/raid1/docker&quot;
}</pre>
  <h3 id="uuN2">Теперь нужно скопировать все файлы из старого каталога в новый, с сохранением прав</h3>
  <pre id="U82r" data-lang="bash">sudo rsync -ahv /var/lib/docker/ /mnt/raid1/docker/</pre>
  <h3 id="94dx">Делаем daemon-reload и запускаем docker</h3>
  <pre id="xur7" data-lang="bash">sudo systemctl daemon-reload
sudo systemctl restart docker</pre>
  <h3 id="fA5n">После удачного запуска проверяем фактический путь хранения данных докер на примере volume&#x27;ов:</h3>
  <pre id="IIHI" data-lang="bash">$ docker volume ls
DRIVER    VOLUME NAME
local     0000c1c24079fb673a4572d8ddc29700fa14...
local     1ae637e8a588a87e5d57d7293d197ac9eefd...


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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@benderinoz/ssh-tips</guid><link>https://teletype.in/@benderinoz/ssh-tips?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz</link><comments>https://teletype.in/@benderinoz/ssh-tips?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=benderinoz#comments</comments><dc:creator>benderinoz</dc:creator><title>SSH tips</title><pubDate>Fri, 03 Feb 2023 14:27:06 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/af/d3/afd3cc05-692e-4985-b6b1-addbf36343f9.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/44/30/44305623-9e49-4684-b7b4-55dd10f630ee.png"></img>ssh -o PreferredAuthentications=password username@11.22.33.44]]></description><content:encoded><![CDATA[
  <h2 id="oI4O"><strong>Авторизация по ssh принудительно по паролю</strong></h2>
  <p id="8PCo">ssh -o PreferredAuthentications=password username@11.22.33.44</p>
  <p id="KW3I">Что-бы указать эту опцию для всех подключений пользователя, добавляем в файл </p>
  <p id="Hz03"><code>~/.ssh/config</code></p>
  <pre id="HjEU">Host *
        IdentitiesOnly=yes</pre>
  <h2 id="tZuS">Проброс портов</h2>
  <p id="2e5J">Пробросить все порты за сервером к себе, тем самым подняв socks proxy</p>
  <p id="baVc"><code>ssh -D localhost:1080 remote-server-ip</code></p>
  <p id="VKsl">Далее в firefox в разделе proxy указываем настройки:</p>
  <figure id="iZ2C" class="m_original">
    <img src="https://img1.teletype.in/files/44/30/44305623-9e49-4684-b7b4-55dd10f630ee.png" width="749" />
  </figure>
  <p id="BSor">После этого в браузере можем открывать любые веб адреса, доступные с удаленного сервера</p>
  <h2 id="6rbg">Проброс удаленного порта к себе</h2>
  <p id="t96W">Например, мы имеем удаленный сервер <strong>remote_server</strong>, у которого на <strong>127.0.0.1</strong>:5432 запущен postgresql, мы хотим пробросить этот порт к себе для локального подключения\тестирования БД.</p>
  <p id="HqkG"><code>ssh -L 6543:<strong>127.0.0.1</strong>:5432 remote_server</code></p>
  <p id="cu4Q">После этого мы можем подключиться к порту 6543 на локальной машине и попадем на порт 5432 удаленного сервера.</p>
  <p id="r5rc">Та же самая команда используется если надо добраться до третьего хоста, который доступен только за remote_server</p>
  <p id="rUUC">localhost &lt;--&gt; remote_server &lt;--&gt; third_server:8080</p>
  <p id="9Ldu"><code>ssh -L 8181:third_server:8080 remote_server</code></p>
  <p id="zKyY">Теперь обратившись на 127.0.0.1:8181 мы попадем на third_server:8080</p>
  <h2 id="dsXf">Проброс своего порта на удаленный сервер</h2>
  <p id="94FW">Аналогично предыдущему примеру, только порт мы пробрасываем со своего хоста на удаленный</p>
  <p id="b4C6"><code>ssh -R 6543:localhost:5432 remote_server</code></p>
  <p id="J8Ca">В данном примере порт 5432 с локальной машины был проброшен на порт 6543 удаленного сервера</p>

]]></content:encoded></item></channel></rss>