<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://blog.fajfer.org" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>fajfer.org</title>
    <link>https://blog.fajfer.org/pl/feed.xml</link>
    <atom:link href="https://blog.fajfer.org/pl/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Polski</description>
    <language>pl</language>
    
    
      
      <item>
        <title>Serwowanie stron z gita i bezpieczeństwo</title>
        <link>https://blog.fajfer.org/pl/blog/dotgit/</link>
        <description>&lt;p&gt;Przeczytałem kiedyś na &lt;a href=&quot;https://niebezpiecznik.pl/post/incydent-w-sklepie-weroniki-sowy-wersow-com-dane-osobowe-byly-dostepne-publicznie/&quot;&gt;Niebezpieczniku&lt;/a&gt; artykuł o wycieku w sklepie influencerki Wersow. Artykuł zainspirował mnie przede wszystkim do zainstalowania wtyczki &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/dotgit/&quot;&gt;DotGit&lt;/a&gt;, ale do tej pory nie udało mi się znaleźc niczego spektakularnie ciekawego. Ot, proste strony statyczne czy kod, który i tak jest publiczny. Do dziś wątpiłem, że ktoś na serio wrzuciłby kredki do gita na prywatne repozytorium a potem rzucał &lt;code&gt;git pull&lt;/code&gt; do synchronizacji w tym samym repozytorium.&lt;/p&gt;
&lt;p&gt;Wyprzedzając pytania - administrator został powiadomiony i wpis został umieszczony już po naprawieniu problemu.&lt;/p&gt;
&lt;h2&gt;Od .git/config do haseł&lt;/h2&gt;
&lt;p&gt;Serfując po internecie z wyżej wymienioną wtyczką dostaniemy &lt;em&gt;popup&lt;/em&gt; o znalezionym repozytorium &lt;code&gt;.git&lt;/code&gt;, adresy zbierają się też w samym narzędziu więc można co jakiś czas spojrzeć co udało się przypadkowo zebrać. Spróbujmy wyciągnąć z tego coś sensownego.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/dotgit/dotgit.png&quot; alt=&quot;Dotgit download all tooltip&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Poręczna funkcjonalność&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pobieramy repozytorium przez wtyczkę, wypakowujemy, przechodzimy do katalogu i możemy zobaczyć, że jest pusty. Po wpisaniu polecenia &lt;code&gt;git status&lt;/code&gt; widać jednak jakie pliki są usunięte:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;On branch master
Your branch is based on &lt;span class=&quot;token string&quot;&gt;&#39;origin/master&#39;&lt;/span&gt;, but the upstream is gone.
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use &lt;span class=&quot;token string&quot;&gt;&quot;git branch --unset-upstream&quot;&lt;/span&gt; to fixup&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

Changes not staged &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; commit:
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use &lt;span class=&quot;token string&quot;&gt;&quot;git add/rm &amp;lt;file&gt;...&quot;&lt;/span&gt; to update what will be committed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use &lt;span class=&quot;token string&quot;&gt;&quot;git restore &amp;lt;file&gt;...&quot;&lt;/span&gt; to discard changes &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; working directory&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        deleted:    .gitignore
        deleted:    .htaccess
        deleted:    .htpasswd
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

no changes added to commit &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;use &lt;span class=&quot;token string&quot;&gt;&quot;git add&quot;&lt;/span&gt; and/or &lt;span class=&quot;token string&quot;&gt;&quot;git commit -a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Git służy do przechowywania historii zmian. Poprzednie commity są w formacie binarnym, w najprostszy sposób możemy dotrzeć do nich używając polecenia &lt;code&gt;git restore .&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;     .gitignore  admin     assets      &lt;span class=&quot;token function&quot;&gt;cron&lt;/span&gt;         index.php   mediacacheAdv            modules     static
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;    .htaccess   admin321  class       css          js          mediacacheArticle        resource    templates
.git  .htpasswd   ajax.php  config.php  imagick.php  mediaCache  mediacachePhotorelation  robots.txt  tmp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jak widać powyżej, pliki się odtworzyły. Pomijając hasła wpisane na sztywno w skryptach. Możemy nawet udać na potrzeby edukacyjne, że ich nie było. Najbardziej zaciekawił mnie plik &lt;code&gt;.htpasswd&lt;/code&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/dotgit/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Byłem ciekaw, czy uda mi się odgadnąć hasło do znalezionego użytkownika. Przykład jest zmyślony, ale ciąg zdarzeń analogiczny. Dla poniższego wpisu w &lt;code&gt;.htpasswd&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;admin:6YPqJe88Wz5fQ&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Napisałem &lt;em&gt;snippet&lt;/em&gt; w Pythonie i dopisałem kilka propozycji dla powyższego użytkownika, (chciałem chwilę później spróbować metodą słownikową) wyglądało to mniej więcej tak:&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; crypt

passwords &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;admin&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;password&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;123456&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;admin123&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token builtin&quot;&gt;hash&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6YPqJe88Wz5fQ&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; password &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; passwords&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; crypt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crypt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Password found: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Password not found in common list&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Po uruchomieniu dostałem potwierdzenie:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ python3 htpasswd.py 
Password found: admin123&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Co stało się dalej?&lt;/h2&gt;
&lt;p&gt;Po moim zgłoszeniu część rzeczy została ukryta w taki sposób:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/dotgit/forbidden.png&quot; alt=&quot;403 Forbidden z serwera Apache2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tu się będę już czepiał, ale chcę pokazać dlaczego jawna wersja oprogramowania w komunikacie błędu daje atakującemu nadmierną ilość informacji. Powyższa wersja Apache2 wskazuje prawdopodobnie na Ubuntu 22.04 LTS (jammy). Dlaczego? Bo ostatnia najnowsza wersja z Ubuntu 20.04 LTS (focal) to 2.4.41&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/dotgit/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;, natomiast w jammy już 2.4.52&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/dotgit/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;. Najnowszy commit również wskazywałby, że strona nie jest juz jakiś czas aktualizowana&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/dotgit/commit.png&quot; alt=&quot;Najnowszy znaleziony commit&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Wnioski&lt;/h2&gt;
&lt;p&gt;Ogromna prośba, żeby nie trzymać w gicie jawnie haseł. To nie jest odpowiednie miejsce. Jak widać, nawet w przypadku korzystania z prywatnego repozytorium coś po drodze może pójść nie tak i hasła mogą wyciec.&lt;/p&gt;
&lt;meta name=&quot;fediverse:creator&quot; content=&quot;@fajfer@mastodon.social&quot; /&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://pl.wikipedia.org/wiki/.htpasswd&quot;&gt;https://pl.wikipedia.org/wiki/.htpasswd&lt;/a&gt; Dostęp 19.02.2026 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/dotgit/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://launchpad.net/ubuntu/focal/+source/apache2&quot;&gt;https://launchpad.net/ubuntu/focal/+source/apache2&lt;/a&gt; Dostęp 19.02.2026 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/dotgit/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://packages.ubuntu.com/jammy/apache2&quot;&gt;https://packages.ubuntu.com/jammy/apache2&lt;/a&gt; Dostęp 19.02.2026 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/dotgit/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
        <pubDate>Thu, 19 Feb 2026 02:03:00 +0000</pubDate>
        <dc:creator>Damian Fajfer</dc:creator>
        <guid>https://blog.fajfer.org/pl/blog/dotgit/</guid>
      </item>
      
    
    
    
    
      
      <item>
        <title>Uruchamianie aplikacji Green Cell UPS (GCUPS) na serwerze GNU/Linux</title>
        <link>https://blog.fajfer.org/pl/blog/gcups/</link>
        <description>&lt;p&gt;PRZETŁUMACZONE MASZYNOWO - OGÓLNIE TODO&lt;/p&gt;
&lt;p&gt;Jeśli jesteś jedną z tych osób, prawdopodobnie też chcesz/potrzebujesz UPS-a. Ponieważ instalowałem skrzynkę teleinformatyczną, szukałem UPS-a do obsługi reszty mojego racka 11&amp;quot; i nie mogłem znaleźć niczego atrakcyjnego na lokalnym rynku od APC. Po pewnych poszukiwaniach zdałem sobie sprawę, że chciałbym mieć wymienną baterię, więc w trakcie nabyłem UPS Green Cell. Reklamowali dedykowane oprogramowanie, które do niego dołączają, ale nie miało to dla mnie znaczenia, dopóki nie odkryłem, że obsługuje kilka dystrybucji GNU/Linux.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/gcups/eon.jpg&quot; alt=&quot;Sygnatura Cosign w Artifactory&quot; /&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/gcups/ups.webp&quot; alt=&quot;Sygnatura Cosign w Artifactory&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Podoba mi się jak UPS Green Cell wygląda podobnie do EON-a z gry Original War&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Aplikacja GC UPS&lt;/h2&gt;
&lt;p&gt;Na ich &lt;a href=&quot;https://gcups.greencell.global/en&quot;&gt;stronie pobierania&lt;/a&gt; (edycja: lub mój &lt;a href=&quot;https://github.com/fajfer/gcups&quot;&gt;GitHub&lt;/a&gt;) oferują gcups (tak się nazywa) dla wszystkich nowoczesnych systemów desktopowych - Windows, MacOS i, co zaskakujące, wsparcie dla Linuxa w postaci .deb, .rpm, .pacman i .tar.gz (z kilkoma skryptami shell). Jest to całkiem solidny wybór wieloplatformowy, ponieważ używają Electrona działającego na Chromium. Najgorszą rzeczą jest to, że to oprogramowanie nie jest open source.&lt;/p&gt;
&lt;p&gt;Ogólnie rzecz biorąc, wsparcie dla Linuxa przekonało mnie do wypróbowania. Nie zamierzam robić większej recenzji tego oprogramowania. Gdy przeprowadziłem kilka udanych testów przez webGUI, pomyślałem, że mogłoby być przydatne do uruchomienia, tylko nie na moim desktopie. Próbowałem uruchomić gcups z jakimiś parametrami, żeby go zdemonizować, ale bez powodzenia. W czasie pisania tego artykułu używam wersji 1.1.7 wydanej 02.06.2023. Uruchomienie gcups na moim serwerze dało mi następujący output:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ gcups 
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;371031&lt;/span&gt;:0915/014627.729749:ERROR:ozone_platform_x11.cc&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;240&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Missing X server or &lt;span class=&quot;token environment constant&quot;&gt;$DISPLAY&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;371031&lt;/span&gt;:0915/014627.729793:ERROR:env.cc&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; The platform failed to initialize.  Exiting.
Segmentation fault &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;core dumped&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/gcups/gc-odp.png&quot; alt=&quot;Sygnatura Cosign w Artifactory&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;Support odpowiadający mi, że nie ma sposobu na uruchomienie gcups bez GUI, udowodnijmy, że się mylą&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Uruchamianie gcups w środowisku CLI&lt;/h2&gt;
&lt;p&gt;Szukanie informacji na temat uruchamiania gcups nigdzie mnie nie zaprowadziło (wersja 1.0.0 została opublikowana w czerwcu 2022), więc zacząłem majstrować. Nawet gdybym poszedł tak daleko (lub tak blisko) jak uruchomienie tego bez X serwera, nadal musiałbym włączyć serwer HTTP w ustawieniach aplikacji. Robiłem standardowe rzeczy, ale nie zauważyłem żadnych nowych procesów uruchamiających się po włączeniu serwera web, &lt;code&gt;strings&lt;/code&gt; nie dał mi żadnego wnikliwego outputu niespecyficznego dla Chromium, nie mogłem też niczego znaleźć w &lt;code&gt;~/.config/gcups&lt;/code&gt;. Jest też katalog &lt;code&gt;/opt/gcups&lt;/code&gt; tworzony podczas instalacji, więc ostatecznie zacząłem szukać w folderze db i - hurra - to było to miejsce.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/gcups/db$ &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt;
gcups-rxdb-0-                                                           gcups-rxdb-0-scheduler-mrview-c37be66b94b0bdae91ef3fcbeab58edf
gcups-rxdb-0-device_parameters                                          gcups-rxdb-0-settings-local
gcups-rxdb-0-device_parameters-local                                    gcups-rxdb-0-test
gcups-rxdb-0-device_parameters-mrview-99560a34de60f5074dcd2be42069d585  gcups-rxdb-0-test-local
gcups-rxdb-0-register                                                   gcups-rxdb-0-test-measurement
gcups-rxdb-0-register-local                                             gcups-rxdb-0-test-measurement-local
gcups-rxdb-0-register-mrview-692a6698c32319395128b449dfae271e           gcups-rxdb-0-test-measurement-mrview-99560a34de60f5074dcd2be42069d585
gcups-rxdb-0-_rxdb_internal                                             gcups-rxdb-0-test-mrview-8b2440dfbb354345cc5c69a011a2beb9
gcups-rxdb-0-scheduler                                                  gcups-rxdb-0-test-mrview-8b851648c605dcf349b861f65fdffef5
gcups-rxdb-0-scheduler-local                                            gcups-rxdb-1-settings  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;--- ten jest interesujący
gcups-rxdb-0-scheduler-mrview-2f6b156c4b77dd00407dbed941ee1abf          pouch__all_dbs__&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uzyskałem dostęp do bazy danych gcups-rxdb-1-settings używając LevelDB przez pythona:&lt;/p&gt;
&lt;pre class=&quot;language-python3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python3&quot;&gt;import plyvel
db = plyvel.DB(&#39;/opt/gcups/db/gcups-rxdb-1-settings&#39;)

for key, value in db:
    print(f&quot;{key.decode()}: {value.decode()}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Co daje nam interesujący output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ÿby-sequenceÿ0000000000000001: {&amp;quot;api&amp;quot;:{&amp;quot;port&amp;quot;:8080,&amp;quot;password&amp;quot;:&amp;quot;hash hasła tutaj&amp;quot;,&amp;quot;enable&amp;quot;:true,&amp;quot;salt&amp;quot;:&amp;quot;sól hasła tutaj&amp;quot;},&amp;quot;_attachments&amp;quot;:{},&amp;quot;_id&amp;quot;:&amp;quot;a733f0a7-4fe2-4120-8603-775370fd871a&amp;quot;,&amp;quot;_rev&amp;quot;:&amp;quot;12-c2e2e2d475614a9aed42806e63a38338&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rozbijając najciekawsze części:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;port&lt;/strong&gt; jest dość oczywisty, to po prostu port HTTP dla naszego serwera web&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;enable&lt;/strong&gt; mówi nam, czy serwer HTTP jest domyślnie włączony przy uruchomieniu gcups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Odkryłem, że można po prostu zastąpić pierwszą i jedyną sekwencję, żeby gcups działał. Jest klucz (4ty od końca) o nazwie &lt;code&gt;document-store&lt;/code&gt;, który przechowuje wszystkie revy poprzednich sekwencji oraz &lt;code&gt;winningRev&lt;/code&gt;, ale w tym przypadku liczy się tylko wartość &lt;code&gt;seq&lt;/code&gt;, która w większości przypadków jest twoją ostatnią &lt;code&gt;by-sequence&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Generowanie własnej by-sequence&lt;/h2&gt;
&lt;p&gt;Teraz gdy wiemy jak uzyskać dostęp do ustawień gcups bez uruchamiania samego gcups, musimy zastąpić port (opcjonalnie), enabled, password i salt. Nie wiem jak wygenerować salt i password ręcznie, więc zalecam zainstalowanie gcups lokalnie, skonfigurowanie go, a następnie wyeksportowanie tego ustawienia na swój serwer. &lt;strong&gt;Pamiętaj, że nie możesz zmienić hasła z webGUI&lt;/strong&gt;. Aby to zrobić, po prostu zainstaluj gcups lokalnie, ustaw hasło i włącz serwer HTTP w ustawieniach. Następnie przejdź do &lt;code&gt;/opt/gcups/db/gcups-rxdb-1-settings&lt;/code&gt; i wykonaj PUT na swoich danych:&lt;/p&gt;
&lt;pre class=&quot;language-python3&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python3&quot;&gt;import plyvel
db = plyvel.DB(&#39;/opt/gcups/db/gcups-rxdb-1-settings&#39;)

db.put(b&#39;&#92;xc3&#92;xbfby-sequence&#92;xc3&#92;xbf0000000000000001&#39;, b&#39;{&quot;api&quot;:{&quot;port&quot;:8080,&quot;password&quot;:&quot;hash hasła tutaj&quot;,&quot;enable&quot;:true,&quot;salt&quot;:&quot;sól hasła tutaj&quot;},&quot;_attachments&quot;:{},&quot;_id&quot;:&quot;a733f0a7-4fe2-4120-8603-775370fd871a&quot;,&quot;_rev&quot;:&quot;12-c2e2e2d475614a9aed42806e63a38338&quot;}&#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nie musisz robić nic więcej. Naśladowałem xserver używając &lt;code&gt;xvfb&lt;/code&gt; i pozwala to na uruchomienie gcups na serwerze w ten sposób:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;xvfb-run gcups&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Następnie możesz uzyskać dostęp do webGUI gcups na &lt;code&gt;host:port&lt;/code&gt; na swoim serwerze, który określiłeś w &lt;code&gt;by-sequence&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Skontaktowałem się z supportem dwa razy, aby potwierdzić, że oprogramowanie nie ma działać bez GUI. Będzie czysto CLI-owe rozwiązanie dla gcups i jest ono na roadmapie Green Cell, ale nie wiadomo kiedy zostanie wydane, co sprawiło, że spędziłem jeden wieczór próbując uruchomić to w niezamierzony sposób.&lt;/p&gt;
&lt;p&gt;Myślę o konteneryzacji kompletnego rozwiązania jeszcze w tym roku, zaktualizuję wpis na blogu później i dostarczę gotowy docker-compose z przekazaniem USB do kontenera (UPS łączy się przez USB z maszyną, żeby gcups był funkcjonalny). Fajnie byłoby też, gdybym nauczył się jak generować kombinację pass/salt dla gcups, bo nie poświęciłem temu zbyt wiele uwagi.&lt;/p&gt;
&lt;p&gt;I last but not least - nie ma sensu, żeby takie oprogramowanie &lt;strong&gt;NIE&lt;/strong&gt; było wolnym oprogramowaniem. Jedyną znaczącą rzeczą, którą by to ujawniło, byłby schemat komunikacji między oprogramowaniem a UPS-em. I co z tego? Każdy producent UPS-ów komunikuje się ze swoim UPS-em w inny sposób, ponieważ nie ma ogólnego protokołu określającego jak to powinno być zrobione. Nie sądzę, żeby to był wielki sekret i że ostatecznie nie mógłby zostać ujawniony przy odrobinie pracy. Nawet gdyby gcups był wolny i ludzie zdecydowali się używać rozwiązań nieopracowanych przez Green Cell, nadal byłoby to korzystne dla Green Cell, ponieważ z powodu różnych schematów komunikacji, te rozwiązania firm trzecich nadal obsługiwałyby tylko ich produkt.&lt;/p&gt;
&lt;p&gt;Teraz gdy jest to closed source, moja praca skupiła się na obejściu wymagania xservera zamiast ulepszaniu ich produktu, a ich produkt nie istniałby, gdyby nie open source.&lt;/p&gt;
&lt;h2&gt;AKTUALIZACJA 03.04.2024&lt;/h2&gt;
&lt;p&gt;Hej! Zmotywowany komentarzami od Roberta udało mi się zdockeryzować powyższe rozwiązanie. Jest jeszcze trochę pracy, ale jestem gotów się jej podjąć i utrzymywać projekt.&lt;/p&gt;
&lt;p&gt;https://github.com/fajfer/gcups&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker pull ghcr.io/fajfer/gcups:1.1.7&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;AKTUALIZACJA 19.08.2024&lt;/h2&gt;
&lt;p&gt;Ze względu na popularne zapotrzebowanie utworzyłem pokój czatowy Matrix, żebym mógł pomagać wam na zawołanie (lub trochę później) - https://matrix.to/#/#gcups:fsfe.org&lt;/p&gt;
&lt;meta name=&quot;fediverse:creator&quot; content=&quot;@fajfer@mastodon.social&quot; /&gt;
</description>
        <pubDate>Sat, 16 Sep 2023 14:00:00 +0000</pubDate>
        <dc:creator>Damian Fajfer</dc:creator>
        <guid>https://blog.fajfer.org/pl/blog/gcups/</guid>
      </item>
      
    
    
    
    
      
      <item>
        <title>Cykl życia sygnatur Cosign w Artifactory</title>
        <link>https://blog.fajfer.org/pl/blog/cosign-artifactory/</link>
        <description>&lt;p&gt;PRZETŁUMACZONE MASZYNOWO - OGÓLNIE TODO&lt;/p&gt;
&lt;p&gt;Dodatkowo zagłębimy się w proponowane rozwiązanie kopiowania sygnatury do docelowego repozytorium podczas fazy promocji lub kopiowania artefaktów, odnosząc się do potencjalnych wyzwań w tym procesie.&lt;/p&gt;
&lt;p&gt;Szczegóły dotyczące podpisywania i weryfikacji kontenerów docker nie będą omawiane w tym wpisie. Zostało to bardzo dobrze wyjaśnione w innych wpisach blogowych&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, jak również w oficjalnej dokumentacji&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;. Można śmiało powiedzieć, że działa to co najmniej od 2021 roku.&lt;/p&gt;
&lt;h2&gt;Praca z Artifactory&lt;/h2&gt;
&lt;p&gt;Przed przystąpieniem do podpisywania musimy uwierzytelnić się w rejestrze docker. Jako przykład w tym scenariuszu używam rejestru docker Artifactory&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fn4&quot; id=&quot;fnref4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;cosign login &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; username &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{{ password }}&#39;&lt;/span&gt; x.artifactory.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cosign może zwrócić błąd, jeśli podasz URL ze schematem:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error: registries must be valid RFC 3986 URI authorities: https://x.artifactory.com
main.go:74: error during command execution: registries must be valid RFC 3986 URI authorities: https://x.artifactory.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rozwiązaniem jest po prostu pominięcie schematu (https:// w powyższym przykładzie).&lt;/p&gt;
&lt;p&gt;Gdy cosign pomyślnie się zaloguje, zbuduj i wypchnij obraz jak zwykle. Następnie powinieneś podpisać swój obraz docker używając cosign sign. Jeśli do tego momentu wszystko zrobiłeś poprawnie, wykonanie cosign verify jako testu na tej samej maszynie da następujący wynik:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cosign verify &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt; cosign.pub x.artifactory.com/fajfer/image:example
The following checks were performed on these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Critical&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Identity&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;docker-reference&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;Image&quot;&lt;/span&gt;:&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Docker-manifest-digest&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sha256:87ef60f558bad79beea6425a3b28989f01dd417164150ab3baab98dcbf04def8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;Type&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cosign container image signature&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;Optional&quot;&lt;/span&gt;:null&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Możesz powtórzyć polecenie na innej maszynie, aby zweryfikować, że sygnatura została pomyślnie przesłana. Wynik powinien być taki sam, a sygnatura powinna być widoczna w interfejsie webowym:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/cosign-artifactory/sig.png&quot; alt=&quot;Sygnatura Cosign w Artifactory&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Więc jaki jest problem?&lt;/h2&gt;
&lt;p&gt;Zgodnie z dokumentacją:&lt;/p&gt;
&lt;p&gt;Dokumentacja Cosign @ af555d5&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sygnatury są przechowywane jako osobne obiekty w rejestrze OCI, z jedynie słabym odniesieniem do obiektu, który &amp;quot;podpisują&amp;quot;. Oznacza to, że ta relacja jest nieprzezroczysta dla rejestru, a sygnatury nie zostaną usunięte ani odśmiecone po usunięciu obrazu. Podobnie można je łatwo skopiować z jednego środowiska do drugiego, ale nie dzieje się to automatycznie.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jeśli cykl życia twojego artefaktu kończy się tutaj, a obrazy stąd są wdrażane na produkcję lub są dostępne publicznie, to wszystko, skończyłeś. W przeciwnym razie, jeśli chcesz promować swoje obrazy lub skopiować je gdzieś indziej, zauważysz, że podczas gdy twoje artefakty są promowane do docelowego repozytorium, ich sygnatury pozostają nienaruszone w repozytorium źródłowym. Co oznacza, że jeśli zbudujesz i podpiszesz artefakty w repozytorium x, to po promocji do repozytorium y cosign da ci tę smutną odpowiedź:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cosign verify &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt; cosign.pub y.artifactory.com/fajfer/image:example
Error: no matching signatures:

main.go:52: error during &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; execution: no matching signatures:&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Co jest nie tak, prawda? Przecież właśnie działało idealnie w starym repozytorium.&lt;/p&gt;
&lt;h2&gt;Proponowane rozwiązanie&lt;/h2&gt;
&lt;p&gt;Musimy skopiować sygnaturę do docelowego repozytorium. Po żądaniu REST API Promote Docker Image musimy wykonać żądanie Copy Item, aby skopiować sygnaturę. Jest tu ważny szczegół - cosign nazywa sygnaturę po SHA256 manifest.json naszego obrazu. Na szczęście możemy łatwo uzyskać dostęp do tych informacji wykonując żądanie File Info. Możemy również obliczyć to sami, ale zakładam, że nie masz już obrazu lokalnie podczas fazy promocji/kopiowania.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.fajfer.org/img/blog/cosign-artifactory/example.png&quot; alt=&quot;Pole Digest w sekcji &#39;Docker Info&#39; w UI również wyświetla hash&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aby lepiej zrozumieć rozwiązanie i uzyskać pojęcie o tym, jak powinny wyglądać twoje żądania, oto przykład w kodzie Ansible, który mógłby zostać użyty do implementacji rozwiązania w twoim systemie CI:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Promote Docker Image
  &lt;span class=&quot;token comment&quot;&gt;# https://jfrog.com/help/r/jfrog-rest-apis/promote-docker-image&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ artifactory_url }}/api/docker/{{ source_repo }}/v2/promote&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; POST
    &lt;span class=&quot;token key atrule&quot;&gt;url_username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ username }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;url_password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ password }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;force_basic_auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;body_format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; json
    &lt;span class=&quot;token key atrule&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;targetRepo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ target_repo }}&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;dockerRepository&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ docker_repository }}&quot;&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Get manifest.json (File Info)
  &lt;span class=&quot;token comment&quot;&gt;# https://jfrog.com/help/r/jfrog-rest-apis/file-info&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &quot;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; artifactory_url &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/api/storage/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; source_repo &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/&#92;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; file_path &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; tag &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/manifest.json&quot;
    &lt;span class=&quot;token key atrule&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; GET
    &lt;span class=&quot;token key atrule&quot;&gt;url_username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ username }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;url_password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ password }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;force_basic_auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; manifest

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Copy cosign signature (Copy Item)
  &lt;span class=&quot;token comment&quot;&gt;# https://jfrog.com/help/r/jfrog-rest-apis/copy-item&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;uri&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &quot;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; artifactory_url &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/api/copy/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; source_repo &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/&#92;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; source_file_path &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/sha256&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; manifest.json.checksums.sha256 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;.sig&#92;
      &lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt;to=/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; target_repo &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; target_file_path &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&quot;
    &lt;span class=&quot;token key atrule&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; POST
    &lt;span class=&quot;token key atrule&quot;&gt;url_username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ username }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;url_password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ password }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;force_basic_auth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To podejście najlepiej wykorzystuje API Artifactory i nie wymaga wcale pobierania obrazu i sygnatury lokalnie.&lt;/p&gt;
&lt;h2&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Wsparcie Cosign dla Artifactory jest bardzo dobrze zrealizowane, a Artifactory wie, że serwuje podpisane obrazy, ponieważ wysyła sygnaturę wraz z kontenerem po wykonaniu docker pull. API tego jednak nie odzwierciedla, ale miejmy nadzieję, że zmieni się to w przyszłości. Podpisywanie kontenerów staje się coraz bardziej popularne i dostępne dzięki narzędziom takim jak cosign, notary i kyverno, żeby wymienić tylko kilka, więc wykonywanie obejść takich jak to nie powinno być wymagane w przyszłości.&lt;/p&gt;
&lt;meta name=&quot;fediverse:creator&quot; content=&quot;@fajfer@mastodon.social&quot; /&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Jabar Asadi, &amp;quot;Digital Signature With Cosign&amp;quot; 4 maja 2023. https://eng.d2iq.com/blog/digital-signature-with-cosign/ Dostęp 22.07.2023 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Sigstore, &amp;quot;Signing Containers&amp;quot; https://docs.sigstore.dev/cosign/signing_with_containers/ GitHub: 18b11e2 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Sigstore, &amp;quot;Verifying&amp;quot; https://docs.sigstore.dev/cosign/verify GitHub: 4186c93 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;JFrog Artifactory Documentation, &amp;quot;Docker Registry&amp;quot; https://jfrog.com/help/r/jfrog-artifactory-documentation/docker-registry Dostęp: 23.07.2023 &lt;a href=&quot;https://blog.fajfer.org/pl/blog/cosign-artifactory/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
        <pubDate>Sun, 23 Jul 2023 14:00:00 +0000</pubDate>
        <dc:creator>Damian Fajfer</dc:creator>
        <guid>https://blog.fajfer.org/pl/blog/cosign-artifactory/</guid>
      </item>
      
    
    
    
    
      
      <item>
        <title>MOC - Mobilna Ogólnodostępna Czytelnia</title>
        <link>https://blog.fajfer.org/pl/blog/moc-czytelnia/</link>
        <description>&lt;p&gt;Niestety, nie pamiętam dokładnie wszystkiego tak, żeby to jakoś zgrabnie opisać, natomiast nam, tj. mi, ekipie wolontariuszy z oddziału w Grajewie wraz z panią Beatą Strzałkowską i jej Szkolnym Kołem Wolontariatu udało nam się spełnić następujące cele:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wygospodarowanie w ZS2 przestrzeni na „miejsce stacjonowania” mobilnej czytelni, czyli adaptacja części biblioteki na kącik czytelniczy&lt;/li&gt;
&lt;li&gt;Zaprojektowanie, wycena i wykonanie muralu nawiązującego do edukacji czytelniczo-medialnej oraz idei wolontariatu&lt;/li&gt;
&lt;li&gt;Organizacja społecznej kampanii reklamowej dotyczącej dostępności MOBILNEJ CZYTELNI w ZS2 i/lub użyczenia jej do innych szkół, ośrodków kulturalno-wychowawczych, czy też w akcjach regionalnych promujących powiat grajewski oraz ideę wolontariatu&lt;/li&gt;
&lt;li&gt;Poszerzenie księgozbioru biblioteki szkolnej o brakujące książki informatyczne&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.fajfer.org/img/volunteer/jestesmy-blisko-2023.jpeg&quot; alt=&quot;moc&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aktualizację posta piszę po trzech latach, ale zawsze cieszy, że pomysł się spodobał a kącik czytelniczy nadal jest rozwijany i wykorzystywany.&lt;/p&gt;
</description>
        <pubDate>Tue, 20 Jun 2023 14:00:00 +0000</pubDate>
        <dc:creator>Damian Fajfer</dc:creator>
        <guid>https://blog.fajfer.org/pl/blog/moc-czytelnia/</guid>
      </item>
      
    
    
      
      <item>
        <title>Warsztaty Bezpiecznie z Żubrem</title>
        <link>https://blog.fajfer.org/pl/blog/bezpiecznie-z-zubrem/</link>
        <description>&lt;p&gt;Poniżej tekst z &lt;a href=&quot;https://www.pekao.com.pl/o-banku/odpowiedzialnosc-spoleczna/wolontariat.html&quot;&gt;broszury o wolontariacie&lt;/a&gt; Wolontariat 2021 Banku Pekao S.A. &amp;quot;Wartość w pomaganiu&amp;quot;:&lt;/p&gt;
&lt;p&gt;Uczniowski Klub Sportowy „Strzelec” w Grajewie postawił sobie za cel, by pomóc nastolatkom w budowaniu asertywnych postaw, wzmocnić ich poczucie własnej wartości i nauczyć reagowania w sytuacji napaści fizycznej. Potrzebny był pomysł na to jak to zrobić i środki finansowe na realizację. Nieoceniona okazała się pomoc wolontariuszy z banku, których liderem był &lt;a href=&quot;https://blog.fajfer.org/pl/about&quot;&gt;Damian Fajfer&lt;/a&gt; z bankowego Centrum IT.&lt;/p&gt;
&lt;p&gt;Pomysł na organizację treningów Krav Magi oraz szkoleń o stosowaniu bezpieczeństwa w sieci zdobył dofinasowanie fundacji bankowej. Z czasem do grupy dołączały nowe osoby. To był strzał w dziesiątkę. Uczestniczki zajęć nauczyły się lepiej analizować otoczenie, dostrzegać zagrożenia. Nie tylko w świecie rzeczywistym, ale i wirtualnym. Wzmocniły swoją pewność siebie i nauczyły się nowych umiejętności.&lt;/p&gt;
&lt;p&gt;&lt;object data=&quot;https://blog.fajfer.org/pdf/jestesmy-blisko-2021.pdf&quot; type=&quot;application/pdf&quot; style=&quot;width:100%;height:600px&quot; aria-label=&quot;1. Ogólne informacje o strategii&quot;&gt;&lt;/object&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Oct 2021 14:00:00 +0000</pubDate>
        <dc:creator>Damian Fajfer</dc:creator>
        <guid>https://blog.fajfer.org/pl/blog/bezpiecznie-z-zubrem/</guid>
      </item>
      
    
  </channel>
</rss>
