{"id":36918,"date":"2019-10-31T22:14:43","date_gmt":"2019-10-31T19:14:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/bezopasnost-helm\/"},"modified":"2019-10-31T22:14:43","modified_gmt":"2019-10-31T19:14:43","slug":"bezopasnost-helm","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-helm","title":{"rendered":"Bezpiecze\u0144stwo Helm","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Istota opowie\u015bci o najpopularniejszym mened\u017cerze pakiet\u00f3w dla Kubernetes mo\u017ce by\u0107 przedstawiona za pomoc\u0105 emoji:<\/p>\n<ul>\n<li>pude\u0142ko \u2014 to Helm (to najbardziej odpowiednie, co mamy w najnowszej wersji Emoji);<\/li>\n<li>zamkni\u0119cie \u2014 bezpiecze\u0144stwo;<\/li>\n<li>ludzika \u2014 rozwi\u0105zanie problemu.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/91099b372fd73bce94268563c3ee2c50.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW rzeczywisto\u015bci wszystko b\u0119dzie troch\u0119 bardziej skomplikowane, a opowie\u015b\u0107 jest pe\u0142na technicznych szczeg\u00f3\u0142\u00f3w dotycz\u0105cych tego, <b>jak uczyni\u0107 Helm bezpieczniejszym<\/b>.<\/p>\n<ul>\n<li>Kr\u00f3tko m\u00f3wi\u0105c, co to jest Helm, je\u015bli nie wiedzia\u0142e\u015b lub zapomnia\u0142e\u015b. Jakie problemy rozwi\u0105zuje i gdzie znajduje si\u0119 w ekosystemie.<\/li>\n<li>Rozwa\u017cmy architektur\u0119 Helma. \u017badna rozmowa o bezpiecze\u0144stwie i o tym, jak uczyni\u0107 narz\u0119dzie lub rozwi\u0105zanie bardziej bezpiecznym, nie mo\u017ce obej\u015b\u0107 si\u0119 bez zrozumienia architektury komponentu.<\/li>\n<li>Om\u00f3wimy komponenty Helma.<\/li>\n<li>Najwa\u017cniejsze pytanie \u2014 przysz\u0142o\u015b\u0107 \u2014 nowa wersja Helm 3.\u00a0<\/li>\n<\/ul>\n<p>\nWszystko w tym artykule dotyczy Helm 2. Ta wersja jest obecnie w produkcji, i prawdopodobnie w\u0142a\u015bnie jej teraz u\u017cywasz, a to w niej wyst\u0119puj\u0105 zagro\u017cenia bezpiecze\u0144stwa.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"_8zNTJ1_R5I\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/_8zNTJ1_R5I\/hqdefault.jpg\" alt=\"Odtwarzaj wideo\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<strong>O prelegencie:<\/strong> Aleksander Chajorow (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/allexx\/\" class=\"user_link\">allexx<\/a><\/noindex>) zajmuje si\u0119 rozwojem od 10 lat, pomaga poprawia\u0107 tre\u015bci <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.python.ru\/2019\">Moscow Python Conf++<\/a><\/noindex> i do\u0142\u0105czy\u0142 do komitetu <noindex><a rel=\"nofollow\" href=\"https:\/\/events.linuxfoundation.org\/events\/helm-summit-2019\/\">Helm Summit<\/a><\/noindex>. Obecnie pracuje w Chainstack jako lider ds. rozwoju \u2014 to hybryda mi\u0119dzy kierownikiem rozwoju a osob\u0105 odpowiedzialn\u0105 za dostarczanie ostatecznych wersji. To znaczy, \u017ce jest na pierwszej linii frontu, gdzie odbywa si\u0119 wszystko, od tworzenia produktu po jego eksploatacj\u0119.<\/p>\n<p>Chainstack to niewielki, pr\u0119\u017cnie rozwijaj\u0105cy si\u0119 startup, kt\u00f3rego celem jest umo\u017cliwienie klientom zapomnienie o infrastrukturze i wyzwaniach zwi\u0105zanych z obs\u0142ug\u0105 zdecentralizowanych aplikacji, zesp\u00f3\u0142 programistyczny znajduje si\u0119 w Singapurze. Nie pro\u015bcie Chainstack o sprzeda\u017c lub zakup kryptowaluty, ale zaproponujcie rozmow\u0119 na temat ram blockchain dla przedsi\u0119biorstw, a ch\u0119tnie wam odpowiedz\u0105.<\/p>\n<h2>Helm<\/h2>\n<p>\nTo mened\u017cer pakiet\u00f3w (chart\u00f3w) dla Kubernetes. Najbardziej zrozumia\u0142y i uniwersalny spos\u00f3b wprowadzania aplikacji do klastra Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/30c0fc1cc1c6ebde97c6e8ec1886ce9f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMowa oczywi\u015bcie o bardziej strukturalnym i przemys\u0142owym podej\u015bciu, ni\u017c tworzenie w\u0142asnych manifest\u00f3w YAML i pisanie ma\u0142ych narz\u0119dzi.<\/p>\n<blockquote><p>Helm to najlepsze, co obecnie mamy z dost\u0119pnych i popularnych opcji.<\/p><\/blockquote>\n<p>\nDlaczego Helm? Przede wszystkim dlatego, \u017ce jest wspierany przez CNCF. Cloud Native to du\u017ca organizacja, kt\u00f3ra jest macierzyst\u0105 dla projekt\u00f3w Kubernetes, etcd, Fluentd i innych.<\/p>\n<p>Innym wa\u017cnym faktem jest to, \u017ce Helm to bardzo popularny projekt. Kiedy w styczniu 2019 roku zaczyna\u0142em my\u015ble\u0107 o tym, jak uczyni\u0107 Helm bezpiecznym, projekt mia\u0142 tysi\u0105c gwiazdek na GitHubie. Do maja ich liczba wzros\u0142a do 12 tysi\u0119cy.<\/p>\n<p>Wielu interesuje si\u0119 Helmem, dlatego nawet je\u015bli nadal go nie u\u017cywasz, wiedza na temat jego bezpiecze\u0144stwa b\u0119dzie przydatna. <strong>Bezpiecze\u0144stwo jest wa\u017cne.<\/strong><\/p>\n<p>G\u0142\u00f3wny zesp\u00f3\u0142 Helma wspierany jest przez Microsoft Azure, co czyni ten projekt do\u015b\u0107 stabilnym w odr\u00f3\u017cnieniu od wielu innych. Wydanie Helm 3 Alpha 2 w po\u0142owie lipca \u015bwiadczy o tym, \u017ce nad projektem pracuje wystarczaj\u0105co du\u017co ludzi, kt\u00f3rzy maj\u0105 ch\u0119\u0107 i si\u0142\u0119, aby rozwija\u0107 i poprawia\u0107 Helm.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/e53c8e64c3cf5eea3fbd9b0095b0f81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHelm rozwi\u0105zuje kilka podstawowych problem\u00f3w zwi\u0105zanych z zarz\u0105dzaniem aplikacjami w Kubernetes.<\/p>\n<ul>\n<li>Pakietowanie aplikacji. Nawet aplikacja typu \u2018Hello, World\u2019 na WordPressie przedstawia ju\u017c kilka us\u0142ug, kt\u00f3re chcemy zapakowa\u0107 razem.<\/li>\n<li>Zarz\u0105dzanie z\u0142o\u017cono\u015bci\u0105, kt\u00f3ra pojawia si\u0119 przy zarz\u0105dzaniu tymi aplikacjami.<\/li>\n<li>Cykl \u017cycia, kt\u00f3ry nie ko\u0144czy si\u0119 po zainstalowaniu lub wdro\u017ceniu aplikacji. Aplikacja wci\u0105\u017c \u017cyje, trzeba j\u0105 aktualizowa\u0107, w czym pomaga Helm, staraj\u0105c si\u0119 wprowadzi\u0107 w\u0142a\u015bciwe \u015brodki i polityki dla tego procesu.<\/li>\n<\/ul>\n<p>\n<strong>Pakietowanie<\/strong> jest zorganizowane w zrozumia\u0142y spos\u00f3b: s\u0105 metadane w pe\u0142nej zgodno\u015bci z dzia\u0142aniem tradycyjnego mened\u017cera pakiet\u00f3w dla Linuxa, Windowsa czy MacOS. Oznacza to repozytorium, zale\u017cno\u015bci od r\u00f3\u017cnych pakiet\u00f3w, metainformacje dla aplikacji, ustawienia, szczeg\u00f3\u0142y konfiguracji, indeksowanie informacji itp. Wszystko to Helm pozwala uzyska\u0107 i wykorzysta\u0107 dla aplikacji.<\/p>\n<p><strong>Zarz\u0105dzanie z\u0142o\u017cono\u015bci\u0105<\/strong>. Je\u015bli masz wiele podobnych aplikacji, potrzebujesz parametryzacji. Z tego wynikaj\u0105 szablony, ale aby nie wymy\u015bla\u0107 w\u0142asnych sposob\u00f3w tworzenia szablon\u00f3w, mo\u017cna skorzysta\u0107 z tego, co Helm oferuje prosto z pude\u0142ka.<\/p>\n<p><strong>Zarz\u0105dzanie cyklem \u017cycia aplikacji<\/strong> \u2014 moim zdaniem to najciekawszy i nierozwi\u0105zany problem. To w\u0142a\u015bnie dlatego kiedy\u015b zacz\u0105\u0142em interesowa\u0107 si\u0119 Helm. Musieli\u015bmy \u015bledzi\u0107 cykl \u017cycia aplikacji, chcieli\u015bmy przenie\u015b\u0107 nasze CI\/CD i cykle aplikacji do tej paradygmy.<\/p>\n<p>Helm pozwala:<\/p>\n<ul>\n<li>zarz\u0105dza\u0107 wdro\u017ceniami, wprowadza poj\u0119cie konfiguracji i rewizji;<\/li>\n<li>skutecznie przeprowadza\u0107 rollback;<\/li>\n<li>wykorzystywa\u0107 hooki na r\u00f3\u017cne zdarzenia;<\/li>\n<li>dodawa\u0107 dodatkowe kontrole aplikacji i reagowa\u0107 na ich wyniki.<\/li>\n<\/ul>\n<p>\nPonadto <strong>Helm ma swoje \u2018baterie\u2019.<\/strong> \u2014 ogromna ilo\u015b\u0107 pysznych rzeczy, kt\u00f3re mo\u017cna w\u0142\u0105czy\u0107 jako wtyczki, upraszczaj\u0105c sobie \u017cycie. Wtyczki mo\u017cna pisa\u0107 samodzielnie, s\u0105 do\u015b\u0107 izolowane i nie wymagaj\u0105 z\u0142o\u017conej architektury. Je\u015bli chcesz co\u015b zrealizowa\u0107, polecam zrobi\u0107 to w formie wtyczki, a potem ewentualnie w\u0142\u0105czy\u0107 do upstream.<\/p>\n<p>Helm opiera si\u0119 na trzech g\u0142\u00f3wnych koncepcjach:<\/p>\n<ul>\n<li><strong>Repozytorium Chart<\/strong> \u2014 opis i zbi\u00f3r parametr\u00f3w, kt\u00f3re mog\u0105 by\u0107 zastosowane w twoim manife\u015bcie.\u00a0<\/li>\n<li><strong>Konfiguracja<\/strong> \u2014 to znaczy warto\u015bci, kt\u00f3re b\u0119d\u0105 mia\u0142y zastosowanie (tekst, warto\u015bci liczbowej itp.).<\/li>\n<li><strong>Release<\/strong> \u0142\u0105czy dwa g\u00f3rne komponenty, kt\u00f3re razem przekszta\u0142caj\u0105 si\u0119 w Release. Wydania mo\u017cna wersjonowa\u0107, co pozwala na organizacj\u0119 cyklu \u017cycia: ma\u0142e w momencie instalacji, a du\u017ce w momencie aktualizacji, obni\u017cenia lub przywr\u00f3cenia.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Architektura Helm<\/h2>\n<p>\nNa schemacie conceptualnie odzwierciedlona jest wysokopoziomowa architektura Helm.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/c5cf54890682a3d6ca7a45021b5006a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrzypomn\u0119, \u017ce Helm to co\u015b, co jest zwi\u0105zane z Kubernetes. Dlatego nie ob\u0119dzie si\u0119 bez klastra Kubernetes (prostok\u0105t). Komponent kube-apiserver znajduje si\u0119 na masterze. Bez Helma mamy Kubeconfig. Helm przynosi jedn\u0105 ma\u0142\u0105 binarn\u0105, je\u015bli mo\u017cna to tak nazwa\u0107, u\u017cyteczno\u015b\u0107 Helm CLI, kt\u00f3ra jest instalowana na komputerze, laptopie, mainframe \u2014 na czymkolwiek.<\/p>\n<p>Ale to nie wystarcza. Helm ma komponent serwera Tiller. Reprezentuje on interesy Helma wewn\u0105trz klastra, jest to tak samo aplikacja wewn\u0105trz klastra Kubernetes, jak ka\u017cda inna.<\/p>\n<p>Nast\u0119pnym komponentem jest Chart Repo \u2014 repozytorium z chartami. Istnieje oficjalne repozytorium i mo\u017ce by\u0107 prywatne repozytorium firmy lub projektu.<\/p>\n<h3>Interakcja<\/h3>\n<p>\nRozwa\u017cmy, jak komponenty architektury interaguj\u0105, gdy chcemy zainstalowa\u0107 aplikacj\u0119 za pomoc\u0105 Helma.<\/p>\n<ul>\n<li>M\u00f3wimy <code>Helm install<\/code>, zwracamy si\u0119 do repozytorium (Chart Repo) i otrzymujemy Helm-chart.<\/li>\n<\/ul>\n<p><\/p>\n<ul>\n<li>Narz\u0119dzie Helm (Helm CLI) interaguje z Kubeconfig, aby ustali\u0107, do kt\u00f3rego klastra si\u0119 odwo\u0142a\u0107.\u00a0<\/li>\n<li>Uzyskawszy te informacje, narz\u0119dzie zwraca si\u0119 do Tiller, kt\u00f3ry znajduje si\u0119 w naszym klastrze, ju\u017c jako aplikacja.\u00a0<\/li>\n<li>Tiller zwraca si\u0119 do Kube-apiserver, aby wykona\u0107 dzia\u0142ania w Kubernetes, stworzy\u0107 okre\u015blone obiekty (us\u0142ugi, podzie, repliki, sekrety itp.).<\/li>\n<\/ul>\n<p>\nNast\u0119pnie upro\u015bcimy schemat, aby zobaczy\u0107 wektory ataku, kt\u00f3rym mo\u017ce zosta\u0107 poddana ca\u0142a architektura Helm. A potem spr\u00f3bujemy j\u0105 zabezpieczy\u0107.<\/p>\n<h3>Wektory ataku<\/h3>\n<p>\nPierwsze potencjalnie s\u0142abe miejsce \u2014 <strong>uprzywilejowane API<\/strong>\u2014<strong>u\u017cytkownik<\/strong>. W ramach schematu to haker, kt\u00f3ry uzyska\u0142 dost\u0119p administratora do Helm CLI.<\/p>\n<p><strong>Nieprivilegowany u\u017cytkownik API<\/strong> te\u017c mo\u017ce stanowi\u0107 zagro\u017cenie, je\u015bli znajduje si\u0119 gdzie\u015b w pobli\u017cu. Taki u\u017cytkownik b\u0119dzie mia\u0142 inny kontekst, na przyk\u0142ad mo\u017ce by\u0107 zarejestrowany w jednym namespace klastra w ustawieniach Kubeconfig.<\/p>\n<p>Najbardziej interesuj\u0105cym wektorem ataku mo\u017ce by\u0107 proces, kt\u00f3ry znajduje si\u0119 wewn\u0105trz klastra gdzie\u015b w pobli\u017cu Tillera i mo\u017ce si\u0119 do niego zwr\u00f3ci\u0107. Mo\u017ce to by\u0107 serwer WWW lub mikroserwis, kt\u00f3ry widzi sieciowe otoczenie klastra.<\/p>\n<p>Egzotyczna, ale rosn\u0105ca w popularno\u015b\u0107, opcja ataku zwi\u0105zana jest z Chart Repo. Chart stworzony przez nieuczciwego autora mo\u017ce zawiera\u0107 niebezpieczny zas\u00f3b, a Ty go uruchomisz, przyjmuj\u0105c to na wiar\u0119. Albo mo\u017ce on podmieni\u0107 chart, kt\u00f3ry \u015bci\u0105gasz z oficjalnego repozytorium, i na przyk\u0142ad stworzy\u0107 zas\u00f3b w postaci polityk i eskalowa\u0107 sobie dost\u0119p.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/2828046feb9ba8413a1b0e8741b4c354.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpr\u00f3bujemy obroni\u0107 si\u0119 przed atakami ze wszystkich tych czterech stron i dowiedzie\u0107 si\u0119, gdzie s\u0105 problemy w architekturze Helma, a gdzie by\u0107 mo\u017ce ich nie ma.<\/p>\n<p>Upro\u015b\u0107my schemat, dodajmy wi\u0119cej element\u00f3w, ale zachowajmy wszystkie podstawowe sk\u0142adniki.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/4110898e79619b8546408c668c48da0d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHelm CLI komunikuje si\u0119 z Chart Repo, wchodzi w interakcj\u0119 z Kubeconfig, a praca jest przekazywana do klastra do komponentu Tiller.<\/p>\n<p>Tiller reprezentowany jest przez dwa obiekty:<\/p>\n<ul>\n<li>Tiller-deploy svc, kt\u00f3ry wystawia pewien serwis;<\/li>\n<li>Tiller-deploy pod (na schemacie w jedynym egzemplarzu w jednej replikacji), na kt\u00f3rym dzia\u0142a ca\u0142y obci\u0105\u017cenie, kt\u00f3ry zwraca si\u0119 do klastra.<\/li>\n<\/ul>\n<p>\nDo interakcji u\u017cywane s\u0105 r\u00f3\u017cne protoko\u0142y i schemy. Z punktu widzenia bezpiecze\u0144stwa najbardziej interesuj\u0105 nas:<\/p>\n<ul>\n<li>Mechanizm, za pomoc\u0105 kt\u00f3rego Helm CLI zwraca si\u0119 do repozytori\u00f3w chart\u00f3w: jaki protok\u00f3\u0142, czy jest autoryzacja i co mo\u017cna z tym zrobi\u0107.<\/li>\n<li>Protok\u00f3\u0142, po kt\u00f3rym Helm CLI, u\u017cywaj\u0105c kubectl, komunikuje si\u0119 z Tillerem. To serwer RPC, zainstalowany wewn\u0105trz klastra.<\/li>\n<li>Sam Tiller jest dost\u0119pny dla mikroserwis\u00f3w, kt\u00f3re znajduj\u0105 si\u0119 w klastrze, i wchodzi w interakcj\u0119 z Kube-apiserver.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/19e7e085567f3bbb49746e6402926bd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm\u00f3wimy wszystkie te kierunki po kolei.<\/p>\n<h2>RBAC<\/h2>\n<p><\/p>\n<blockquote><p>Bezsensownie jest m\u00f3wi\u0107 o jakimkolwiek bezpiecze\u0144stwie Helma lub innej us\u0142ugi wewn\u0105trz klastra, je\u015bli RBAC nie jest w\u0142\u0105czony.<\/p><\/blockquote>\n<p>\nWydaje si\u0119, \u017ce to nie naj\u015bwie\u017csza rekomendacja, ale jestem pewien, \u017ce do tej pory wielu nie w\u0142\u0105czy\u0142o RBAC nawet w produkcji, poniewa\u017c to du\u017co zachodu i trzeba wiele rzeczy ustawi\u0107. Niemniej jednak, zach\u0119cam do zrobienia tego.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/37ee8aeb2b331b75ea5569c0b114a756.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/rbac.dev\/\">https:\/\/rbac.dev\/<\/a><\/noindex> \u2014 strona adwokacka dla RBAC. Zgromadzono tam ogromn\u0105 ilo\u015b\u0107 interesuj\u0105cych materia\u0142\u00f3w, kt\u00f3re pomog\u0105 w konfiguracji RBAC, poka\u017c\u0105, dlaczego jest on dobry i jak w og\u00f3le \u017cy\u0107 z nim w produkcji.<\/p>\n<p>Postaram si\u0119 wyja\u015bni\u0107, jak dzia\u0142a Tiller i RBAC. Tiller dzia\u0142a wewn\u0105trz klastra pod pewnym kontem serwisowym. Zazwyczaj, je\u015bli RBAC nie jest skonfigurowany, to b\u0119dzie superuser. W podstawowej konfiguracji Tiller b\u0119dzie administratorem. Dlatego cz\u0119sto m\u00f3wi si\u0119, \u017ce Tiller to tunel SSH do waszego klastra. W rzeczywisto\u015bci tak jest, wi\u0119c mo\u017cna u\u017cy\u0107 osobnego, wyspecjalizowanego konta serwisowego zamiast Domy\u015blnego Konta Serwisowego na powy\u017cszym schemacie.<\/p>\n<p>Gdy inicjalizujesz Helm, po raz pierwszy go instaluj\u0105c na serwerze, mo\u017cesz okre\u015bli\u0107 konto serwisowe za pomoc\u0105 <code>--service-account<\/code>. To pozwoli u\u017cywa\u0107 u\u017cytkownika z minimalnym zestawem niezb\u0119dnych uprawnie\u0144. Jednak trzeba b\u0119dzie stworzy\u0107 tak\u0105 \u201e\u0142a\u0144cuch\u201d: Role i RoleBinding.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/ec805cde756495cfd5c480ac40739c43.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNiestety, Helm nie zrobi tego za ciebie. Ty lub tw\u00f3j administrator klastra Kubernetes musicie wcze\u015bniej przygotowa\u0107 zestaw Role, RoleBinding dla konta serwisowego, aby przekaza\u0107 Helm.<\/p>\n<p>Pojawia si\u0119 pytanie \u2014 jaka jest r\u00f3\u017cnica mi\u0119dzy Role a ClusterRole? R\u00f3\u017cnica polega na tym, \u017ce ClusterRole dzia\u0142a dla wszystkich przestrzeni nazw, w przeciwie\u0144stwie do zwyk\u0142ych Role i RoleBinding, kt\u00f3re dzia\u0142aj\u0105 tylko dla wyspecjalizowanej przestrzeni nazw. Mo\u017cna skonfigurowa\u0107 polityki zar\u00f3wno dla ca\u0142ego klastra i wszystkich przestrzeni nazw, jak i spersonalizowane dla ka\u017cdej przestrzeni nazw oddzielnie.<\/p>\n<p>Warto wspomnie\u0107, \u017ce RBAC pozwala rozwi\u0105za\u0107 jeszcze jeden powa\u017cny problem. Wiele os\u00f3b skar\u017cy si\u0119, \u017ce Helm, niestety, nie jest multitenancy (nie wspiera multiarendno\u015bci). Je\u015bli kilka zespo\u0142\u00f3w korzysta z klastra i u\u017cywa Helma, zasadniczo niemo\u017cliwe jest skonfigurowanie polityk i ograniczenie ich dost\u0119pu w ramach tego klastra, poniewa\u017c istnieje pewne konto serwisowe, z kt\u00f3rego dzia\u0142a Helm i kt\u00f3re tworzy wszystkie zasoby w klastrze, co czasami bywa bardzo niewygodne. Tak, to prawda \u2014 zar\u00f3wno sam plik binarny, jak i proces, <strong>Helm Tiller nie ma poj\u0119cia o multiarendno\u015bci.<\/strong>.<\/p>\n<p>Jednak istnieje doskona\u0142y spos\u00f3b, kt\u00f3ry pozwala uruchomi\u0107 Tillera w klastrze kilka razy. Nie ma z tym \u017cadnych problem\u00f3w, Tiller mo\u017cna uruchomi\u0107 w ka\u017cdej przestrzeni nazw. Dzi\u0119ki temu mo\u017cna skorzysta\u0107 z RBAC, Kubeconfig jako kontekstu i ograniczy\u0107 dost\u0119p do specjalnego Helma.<\/p>\n<p>B\u0119dzie to wygl\u0105da\u0107 nast\u0119puj\u0105co.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/eae922c7b5e1422fb51667364ed79e0a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa przyk\u0142ad, istniej\u0105 dwa Kubeconfig z kontekstem dla r\u00f3\u017cnych zespo\u0142\u00f3w (dwa namespace): zesp\u00f3\u0142 X dla zespo\u0142u deweloper\u00f3w oraz klaster administratora. Klaster administratora ma sw\u00f3j szeroki Tiller, kt\u00f3ry znajduje si\u0119 w przestrzeni Kube-system namespace, wi\u0119c posiada zaawansowane konto us\u0142ugi. Jest oddzielny namespace dla zespo\u0142u deweloper\u00f3w, mog\u0105 oni wprowadza\u0107 swoje us\u0142ugi w specjalnym namespace.<\/p>\n<p>To jest praktyczne podej\u015bcie, Tiller nie jest na tyle zasobo\u017cerny, aby to mia\u0142o powa\u017cny wp\u0142yw na Tw\u00f3j bud\u017cet. To jedno z szybciej dzia\u0142aj\u0105cych rozwi\u0105za\u0144.<\/p>\n<blockquote><p>Nie kr\u0119puj si\u0119 dostosowa\u0107 osobno Tiller i dostarczy\u0107 Kubeconfig z kontekstem dla zespo\u0142u, konkretnego dewelopera lub dla \u015brodowiska: Dev, Staging, Production (ma\u0142o prawdopodobne, \u017ce wszystko b\u0119dzie w jednym klastrze, jednak mo\u017cna to zrealizowa\u0107).<\/p><\/blockquote>\n<p>\nKontynuuj\u0105c nasz\u0105 opowie\u015b\u0107, prze\u0142\u0105czymy si\u0119 od RBAC i porozmawiamy o ConfigMaps.<\/p>\n<h3>ConfigMaps<\/h3>\n<p>\nHelm u\u017cywa ConfigMaps jako magazynu danych. Kiedy m\u00f3wili\u015bmy o architekturze, nie by\u0142o tam \u017cadnej bazy danych, w kt\u00f3rej przechowywane by\u0142yby informacje o wydaniach, konfiguracjach, rollbacks itd. W tym celu u\u017cywane s\u0105 ConfigMaps.<\/p>\n<p>G\u0142\u00f3wnym problemem z ConfigMaps jest to, \u017ce s\u0105 one zasadniczo niebezpieczne, poniewa\u017c <strong>nie mo\u017cna w nich przechowywa\u0107 danych wra\u017cliwych.<\/strong>. M\u00f3wimy tu o wszystkim, co nie powinno wychodzi\u0107 poza us\u0142ug\u0119, na przyk\u0142ad has\u0142ach. Najbardziej natywnym sposobem dla Helma jest obecnie przej\u015bcie od u\u017cywania ConfigMaps do sekret\u00f3w.<\/p>\n<p>Jest to bardzo proste do zrealizowania. Przedefiniowujesz ustawienia Tillera i wskazujesz, \u017ce magazynem b\u0119d\u0105 sekrety. Wtedy przy ka\u017cdym wdro\u017ceniu otrzymasz nie ConfigMap, a sekret.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/7fd12bfbed5c6c8111a5126c2ab9f853.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017cesz zaprotestowa\u0107, \u017ce sekrety same w sobie to dziwna koncepcja i nie s\u0105 zbyt bezpieczne. Jednak warto zrozumie\u0107, \u017ce tym zajmuj\u0105 si\u0119 sami deweloperzy Kubernetes. Od wersji 1.10, a wi\u0119c do\u015b\u0107 dawno temu, istnieje mo\u017cliwo\u015b\u0107 pod\u0142\u0105czenia odpowiedniego magazynu do przechowywania sekret\u00f3w, przynajmniej w publicznych chmurach. Obecnie zesp\u00f3\u0142 pracuje nad tym, aby lepiej zarz\u0105dza\u0107 dost\u0119pem do sekret\u00f3w dla poszczeg\u00f3lnych pod\u00f3w lub innych byt\u00f3w.<\/p>\n<blockquote><p>Magazyn Helm lepiej przekszta\u0142ci\u0107 na sekrety, a te z kolei zabezpieczy\u0107 w spos\u00f3b scentralizowany.<\/p><\/blockquote>\n<p>\nOczywi\u015bcie pozostanie <strong>limit przechowywania danych wynosz\u0105cy 1 MB<\/strong>. Helm u\u017cywa etcd jako rozproszonego magazynu dla ConfigMaps. Uznali tam, \u017ce to odpowiedni kawa\u0142ek danych do replikacji itd. W tej kwestii jest ciekawe dyskusja na Reddit, polecam poszuka\u0107 tej zabawnej lektury na weekend lub przeczyta\u0107 podsumowanie. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/issues\/1413\">tutaj<\/a><\/noindex>.<\/p>\n<h3>Repozytoria Chart\u00f3w<\/h3>\n<p>\nCharty s\u0105 najbardziej spo\u0142ecznie wra\u017cliwe i mog\u0105 sta\u0107 si\u0119 \u017ar\u00f3d\u0142em \u00abMan in the middle\u00bb, szczeg\u00f3lnie je\u015bli u\u017cywasz domy\u015blnego rozwi\u0105zania. Przede wszystkim chodzi o repozytoria, kt\u00f3re s\u0105 udost\u0119pniane przez HTTP.<\/p>\n<blockquote><p>Zdecydowanie nale\u017cy udost\u0119pnia\u0107 Helm Repo przez HTTPS \u2014 to najlepsza opcja i kosztuje niewiele.<\/p><\/blockquote>\n<p>\nZwr\u00f3\u0107 uwag\u0119 na <strong>mechanizm podpis\u00f3w chart\u00f3w<\/strong>. Technologia jest banalnie prosta. To to samo, co wykorzystujesz na GitHubie, zwyk\u0142a maszyna PGP z kluczami publicznymi i prywatnymi. Skonfiguruj j\u0105 i b\u0119dziesz mia\u0142 pewno\u015b\u0107, \u017ce maj\u0105c odpowiednie klucze, podpisujesz wszystko, co jest naprawd\u0119 twoim chartem.<\/p>\n<p>Ponadto, <strong>Klient Helm obs\u0142uguje TLS<\/strong> (nie w sensie HTTP z serwera, a wzajemny TLS). Mo\u017cesz u\u017cy\u0107 kluczy serwerowych i klienckich do komunikacji. Powiem szczerze, nie u\u017cywam takiego mechanizmu z powodu niech\u0119ci do wzajemnych certyfikat\u00f3w. W zasadzie, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/chartmuseum\">chartmuseum<\/a><\/noindex> \u2014 g\u0142\u00f3wne narz\u0119dzie do udost\u0119pniania Helm Repo dla Helm 2 \u2014 obs\u0142uguje tak\u017ce basic auth. Mo\u017cna u\u017cy\u0107 basic auth, je\u015bli to wygodniejsze i zapewnia wi\u0119kszy komfort.<\/p>\n<p>Jest te\u017c wtyczka <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hayorov\/helm-gcs\">helm-gcs<\/a><\/noindex>, kt\u00f3ra pozwala umieszcza\u0107 Repozytoria Chart\u00f3w w Google Cloud Storage. To do\u015b\u0107 wygodne, dzia\u0142a \u015bwietnie i jest do\u015b\u0107 bezpieczne, poniewa\u017c wszystkie opisane mechanizmy s\u0105 wdra\u017cane.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/6a72bfd96c7eb0e2fdd7bcbf128e6433.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJe\u017celi w\u0142\u0105czysz HTTPS lub TLS, u\u017cyjesz mTLS, dodasz basic auth, aby jeszcze bardziej zmniejszy\u0107 ryzyko, uzyskasz bezpieczny kana\u0142 komunikacji mi\u0119dzy Helm CLI a Repozytorium Chart\u00f3w.<\/p>\n<h3>gRPC API<\/h3>\n<p>\nNast\u0119pny krok jest bardzo odpowiedzialny \u2014 zabezpieczy\u0107 Tiller, kt\u00f3ry znajduje si\u0119 w klastrze i jest z jednej strony serwerem, a z drugiej strony \u2014 sam zwraca si\u0119 do innych komponent\u00f3w i stara si\u0119 przedstawia\u0107 jako kto\u015b inny.<\/p>\n<p>Jak ju\u017c powiedzia\u0142em, Tiller \u2014 us\u0142uga, kt\u00f3ra udost\u0119pnia gRPC, klient Helm \u0142\u0105czy si\u0119 z nim przez gRPC. Domy\u015blnie, oczywi\u015bcie, TLS jest wy\u0142\u0105czony. Dlaczego to zrobiono \u2014 to kwestia dyskusyjna, wydaje mi si\u0119, \u017ce dla uproszczenia konfiguracji na pocz\u0105tku.<\/p>\n<blockquote><p>Dla produkcji, a nawet dla stagingu, zalecam w\u0142\u0105czenie TLS w gRPC.<\/p><\/blockquote>\n<p>\nMoim zdaniem, w przeciwie\u0144stwie do mTLS dla chart\u00f3w, tutaj jest to na miejscu i robi si\u0119 to bardzo prosto \u2014 generujesz infrastruktur\u0119 PQI, tworzysz certyfikat, uruchamiasz Tiller, przekazujesz certyfikat podczas inicjalizacji. Po tym wszystkim mo\u017cesz wykonywa\u0107 wszystkie polecenia Helm, pos\u0142uguj\u0105c si\u0119 wygenerowanym certyfikatem i kluczem prywatnym.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/ed55b9a465ed1278b272c52c90b2b345.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW ten spos\u00f3b zabezpieczysz si\u0119 przed wszystkimi zapytaniami do Tiller z zewn\u0105trz klastra.<\/p>\n<p>Wi\u0119c zabezpieczyli\u015bmy kana\u0142 po\u0142\u0105czenia z Tiller, ju\u017c om\u00f3wili\u015bmy RBAC i dostosowali\u015bmy prawa apiserwera Kubernetes, zmniejszyli\u015bmy domen\u0119, z kt\u00f3r\u0105 mo\u017ce on wsp\u00f3\u0142dzia\u0142a\u0107.<\/p>\n<h2>Zabezpieczony Helm<\/h2>\n<p>\nPrzyjrzyjmy si\u0119 ostatecznej schemacie. To ta sama architektura z tymi samymi strza\u0142kami.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/6672e254ad93b917f57794e1619a572e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWszystkie po\u0142\u0105czenia teraz mo\u017cna odwa\u017cnie rysowa\u0107 na zielono:<\/p>\n<ul>\n<li>dla Chart Repo u\u017cywamy TLS lub mTLS oraz uwierzytelniania podstawowego;<\/li>\n<li>mTLS dla Tiller, i jest on wystawiony jako us\u0142uga gRPC z TLS, u\u017cywamy certyfikat\u00f3w;<\/li>\n<li>w klastrze u\u017cywany jest specjalny konto us\u0142ugi z Rol\u0105 i RoleBinding.\u00a0<\/li>\n<\/ul>\n<p>\nZnacznie zabezpieczyli\u015bmy klaster, ale kto\u015b m\u0105dry powiedzia\u0142:<\/p>\n<blockquote><p>\u201eAbsolutnie bezpieczne rozwi\u0105zanie mo\u017ce by\u0107 tylko jedno \u2014 wy\u0142\u0105czony komputer, kt\u00f3ry znajduje si\u0119 w betonowej skrzynce i jest strze\u017cony przez \u017co\u0142nierzy\u201d.<\/p><\/blockquote>\n<p>\nIstniej\u0105 r\u00f3\u017cne sposoby manipulacji danymi i znajdowania nowych wektor\u00f3w atak\u00f3w. Jednak jestem pewien, \u017ce te zalecenia pozwol\u0105 zrealizowa\u0107 podstawowy przemys\u0142owy standard bezpiecze\u0144stwa.<\/p>\n<h2>Bonus<\/h2>\n<p>\nTa cz\u0119\u015b\u0107 nie odnosi si\u0119 bezpo\u015brednio do bezpiecze\u0144stwa, ale r\u00f3wnie\u017c b\u0119dzie przydatna. Poka\u017c\u0119 niekt\u00f3re interesuj\u0105ce rzeczy, o kt\u00f3rych niewiele os\u00f3b wie. Na przyk\u0142ad, jak szuka\u0107 chart\u00f3w \u2014 oficjalnych i nieoficjalnych.<\/p>\n<p>W repozytorium <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/charts\">github.com\/helm\/charts<\/a><\/noindex> aktualnie jest oko\u0142o 300 chart\u00f3w i dwa strumienie: stable i incubator. Ten, kto kontrybuuje, dobrze wie, jak trudno jest przej\u015b\u0107 z incubator do stable, i jak \u0142atwo wylecie\u0107 ze stable. Jednak nie jest to najlepsze narz\u0119dzie do wyszukiwania chart\u00f3w dla Prometheusa i wszystkiego, co lubisz, z jednego prostego powodu \u2014 to nie portal, gdzie wygodnie mo\u017cna szuka\u0107 pakiet\u00f3w.<\/p>\n<p>Ale jest us\u0142uga <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.helm.sh\/\">hub.helm.sh<\/a><\/noindex>, z pomoc\u0105 kt\u00f3rej \u0142atwiej jest znale\u017a\u0107 chart. Najwa\u017cniejsze, \u017ce jest tam znacznie wi\u0119cej zewn\u0119trznych repozytori\u00f3w i dost\u0119pnych jest prawie 800 chart\u00f3w. Dodatkowo, mo\u017cesz pod\u0142\u0105czy\u0107 swoje repozytorium, je\u015bli z jakichkolwiek powod\u00f3w nie chcesz wysy\u0142a\u0107 swoich chart\u00f3w do stable.<\/p>\n<p>Wypr\u00f3buj hub.helm.sh i rozwijajmy go razem. Ta us\u0142uga jest pod projektem Helm, a ty mo\u017cesz kontrybucjowa\u0107 nawet w jego UI, je\u015bli jeste\u015b frontendowcem i chcesz po prostu poprawi\u0107 wygl\u0105d.<\/p>\n<p>Chcia\u0142bym jeszcze zwr\u00f3ci\u0107 uwag\u0119 na <strong>integracj\u0119 Open Service Broker API<\/strong>. Brzmi to skomplikowanie i niejasno, ale rozwi\u0105zuje problemy, z kt\u00f3rymi wszyscy si\u0119 borykaj\u0105. Wyja\u015bni\u0119 na prostym przyk\u0142adzie.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/3aeb7e0781e50a79b518f1056873f73a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMamy klaster Kubernetes, w kt\u00f3rym chcemy uruchomi\u0107 klasyczn\u0105 aplikacj\u0119 \u2014 WordPress. Zazwyczaj do pe\u0142nej funkcjonalno\u015bci potrzebna jest baza danych. Istnieje wiele r\u00f3\u017cnych rozwi\u0105za\u0144, na przyk\u0142ad mo\u017cna uruchomi\u0107 w\u0142asn\u0105 us\u0142ug\u0119 stateful. To nie jest zbyt wygodne, ale wielu tak robi.<\/p>\n<p>Inni, na przyk\u0142ad my w Chainstack, korzystaj\u0105 z zarz\u0105dzanych baz danych, takich jak MySQL czy PostgreSQL, dla serwer\u00f3w. Dlatego nasza baza danych znajduje si\u0119 gdzie\u015b w chmurze.<\/p>\n<p>Ale pojawia si\u0119 problem: trzeba po\u0142\u0105czy\u0107 nasz\u0105 us\u0142ug\u0119 z baz\u0105 danych, stworzy\u0107 flavor bazy danych, przekaza\u0107 dane uwierzytelniaj\u0105ce i jako\u015b nimi zarz\u0105dza\u0107. Wszystko to zazwyczaj wykonywane jest r\u0119cznie przez administratora systemu lub programist\u0119. Nie ma problemu, gdy jest ma\u0142o aplikacji. Gdy jest ich du\u017co, potrzebny jest kombajn. Taki kombajn istnieje \u2014 to Service Broker. Umo\u017cliwia korzystanie ze specjalnego pluginu do klastra chmurowego i zamawianie zasob\u00f3w od dostawcy przez Brokera, jakby to by\u0142 API. Mo\u017cna do tego wykorzysta\u0107 natywne narz\u0119dzia Kubernetes.<\/p>\n<p>To bardzo proste. Mo\u017cna na przyk\u0142ad za\u017c\u0105da\u0107 Managed MySQL w Azure z podstawowym tier (mo\u017cna to skonfigurowa\u0107). Korzystaj\u0105c z API Azure, baza danych zostanie utworzona i przygotowana do u\u017cycia. Nie b\u0119dziesz musia\u0142 w to ingerowa\u0107, tym zajmuje si\u0119 plugin. Na przyk\u0142ad, OSBA (plugin Azure) zwr\u00f3ci dane uwierzytelniaj\u0105ce do us\u0142ugi i przeka\u017ce je Helm. B\u0119dziesz m\u00f3g\u0142 korzysta\u0107 z WordPressa z chmurowym MySQL, nie martwi\u0105c si\u0119 o zarz\u0105dzane bazy danych i o stateful us\u0142ugi wewn\u0105trz.<\/p>\n<blockquote><p>Mo\u017cna powiedzie\u0107, \u017ce Helm pe\u0142ni rol\u0119 kleju, kt\u00f3ry z jednej strony pozwala wdra\u017ca\u0107 us\u0142ugi, a z drugiej \u2014 korzysta\u0107 z zasob\u00f3w dostawc\u00f3w chmury.<\/p><\/blockquote>\n<p>\nMo\u017cesz napisa\u0107 w\u0142asny plugin i wykorzysta\u0107 t\u0119 histori\u0119 on-premise. Wtedy po prostu b\u0119dziesz mie\u0107 w\u0142asny plugin do korporacyjnego dostawcy chmury. Polecam spr\u00f3bowa\u0107 takiego podej\u015bcia, szczeg\u00f3lnie je\u015bli masz du\u017c\u0105 skal\u0119 i chcesz szybko uruchomi\u0107 dev, staging lub ca\u0142\u0105 infrastruktur\u0119 pod funkcjonalno\u015b\u0107. To upro\u015bci \u017cycie twoim dzia\u0142om operacyjnym lub DevOps.<\/p>\n<p>Jeszcze jedno odkrycie, kt\u00f3re ju\u017c wspomina\u0142em \u2014 to <strong>plugin helm-gcs<\/strong>, kt\u00f3ry pozwala korzysta\u0107 z Google-bucket\u00f3w (przechowywanie obiektowe), aby przechowywa\u0107 wykresy Helm.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/30888c4f9b5dba14b87ba1e29e0ebed7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPotrzebujesz tylko czterech polece\u0144, aby zacz\u0105\u0107 go u\u017cywa\u0107:<\/p>\n<ol>\n<li>zainstalowa\u0107 plugin;<\/li>\n<li>zainicjowa\u0107 go;<\/li>\n<li>ustaw \u015bcie\u017ck\u0119 do bucketa znajduj\u0105cego si\u0119 w GCP;<\/li>\n<li>opublikowa\u0107 wykresy w standardowy spos\u00f3b.<\/li>\n<\/ol>\n<p>\nPi\u0119kno polega na tym, \u017ce b\u0119dzie u\u017cywana natywna metoda GCP do autoryzacji. Mo\u017cesz u\u017cy\u0107 konta us\u0142ugowego, konta dewelopera \u2013 czegokolwiek. To bardzo wygodne i nie kosztuje nic w eksploatacji. Je\u015bli, tak jak ja, propagujesz filozofi\u0119 opsless, b\u0119dzie to bardzo wygodne, zw\u0142aszcza dla ma\u0142ych zespo\u0142\u00f3w.<\/p>\n<h2>Alternatywy<\/h2>\n<p>\nHelm nie jest jedynym rozwi\u0105zaniem do zarz\u0105dzania us\u0142ugami. Wok\u00f3\u0142 niego jest wiele pyta\u0144, wi\u0119c mo\u017ce dlatego tak szybko pojawi\u0142a si\u0119 trzecia wersja. Oczywi\u015bcie istniej\u0105 alternatywy.<\/p>\n<p>Mog\u0105 to by\u0107 zar\u00f3wno wyspecjalizowane rozwi\u0105zania, takie jak Ksonnet czy Metaparticle. Mo\u017cesz u\u017cy\u0107 swoich klasycznych narz\u0119dzi do zarz\u0105dzania infrastruktur\u0105 (Ansible, Terraform, Chef itp.) do tych samych cel\u00f3w, o kt\u00f3rych m\u00f3wi\u0142em.<\/p>\n<p>Wreszcie, istnieje rozwi\u0105zanie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/operator-framework\">Operator Framework<\/a><\/noindex>, kt\u00f3rego popularno\u015b\u0107 ro\u015bnie.<\/p>\n<blockquote><p>Operator Framework to g\u0142\u00f3wna alternatywa dla Helma, na kt\u00f3r\u0105 warto zwr\u00f3ci\u0107 uwag\u0119.<\/p><\/blockquote>\n<p>\nJest bardziej natywne dla CNCF i Kubernetes, <strong>ale pr\u00f3g wej\u015bcia jest znacznie wy\u017cszy<\/strong>, wymaga wi\u0119cej programowania i mniej opisywania manifest\u00f3w.<\/p>\n<p>Istniej\u0105 r\u00f3\u017cne dodatki, takie jak Draft, Scaffold. Znacznie u\u0142atwiaj\u0105 \u017cycie, na przyk\u0142ad deweloperom upraszczaj\u0105 cykl wysy\u0142ania i uruchamiania Helma do wdro\u017cenia \u015brodowiska testowego. Nazwa\u0142bym je rozszerzeniami mo\u017cliwo\u015bci.<\/p>\n<p>Oto obrazkowy wykres pokazuj\u0105cy, gdzie co si\u0119 znajduje.<\/p>\n<p><img decoding=\"async\" alt=\"Bezpiecze\u0144stwo Helm\" src=\"\/wp-content\/uploads\/2019\/08\/81a8236c975d5e1649acaaa7989c27ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa osi X poziom twojej osobistej kontroli nad tym, co si\u0119 dzieje, a na osi Y poziom natywno\u015bci Kubernetes. Helm wersji 2 znajduje si\u0119 gdzie\u015b po\u015brodku. W wersji 3 nie jest to kolosalna zmiana, ale poprawi\u0142y si\u0119 zar\u00f3wno kontrola, jak i poziom natywno\u015bci. Rozwi\u0105zania poziomu Ksonnet wci\u0105\u017c ust\u0119puj\u0105 nawet Helmowi 2. Niemniej jednak warto im si\u0119 przyjrze\u0107, aby wiedzie\u0107, co jeszcze jest w tym \u015bwiecie. Oczywi\u015bcie tw\u00f3j mened\u017cer konfiguracji b\u0119dzie pod twoj\u0105 kontrol\u0105, ale zupe\u0142nie nie jest natywny dla Kubernetes.<\/p>\n<p>Operator Framework jest absolutnie natywny dla Kubernetes i pozwala zarz\u0105dza\u0107 nim znacznie elegancko i skrupulatnie (ale pami\u0119tajmy o poziomie wej\u015bcia). Raczej nadaje si\u0119 do specjalizowanej aplikacji i tworzenia dla niej zarz\u0105dzania, a nie jako maszynka do pakowania ogromnej liczby aplikacji za pomoc\u0105 Helma.<\/p>\n<p>Rozszerzenia po prostu nieco poprawiaj\u0105 kontrol\u0119, uzupe\u0142niaj\u0105 workflow lub przyspieszaj\u0105 CI\/CD pipelines.<\/p>\n<h2>Przysz\u0142o\u015b\u0107 Helma<\/h2>\n<p>\nDobr\u0105 wiadomo\u015bci\u0105 jest to, \u017ce pojawia si\u0119 Helm 3. Ju\u017c wydano wersj\u0119 alfa Helm 3.0.0-alpha.2, mo\u017cna j\u0105 wypr\u00f3bowa\u0107. Jest do\u015b\u0107 stabilna, ale funkcjonalno\u015b\u0107 jest p\u00f3ki co ograniczona.<\/p>\n<p>Po co potrzebny jest Helm 3? Przede wszystkim to historia o <strong>znikni\u0119ciu Tiller<\/strong>, jako komponentu. To, jak ju\u017c rozumiesz, ogromny krok naprz\u00f3d, poniewa\u017c z punktu widzenia bezpiecze\u0144stwa architektury wszystko staje si\u0119 prostsze.<\/p>\n<p>Kiedy tworzono Helm 2, a to by\u0142o w czasach Kubernetes 1.8 lub nawet wcze\u015bniej, wiele koncepcji by\u0142o niedojrza\u0142ych. Na przyk\u0142ad koncepcja CRD jest teraz aktywnie wdra\u017cana, a Helm b\u0119dzie <strong>korzysta\u0107 z CRD<\/strong>, aby przechowywa\u0107 struktury. B\u0119dzie mo\u017cliwe u\u017cywanie tylko klienta i nieposiadanie cz\u0119\u015bci serwerowej. W zwi\u0105zku z tym mo\u017cna b\u0119dzie u\u017cywa\u0107 natywnych komend Kubernetes do pracy ze strukturami i zasobami. To ogromny krok naprz\u00f3d.<\/p>\n<p>Pojawi si\u0119 <strong>wsparcie dla natywnych repozytori\u00f3w OCI<\/strong> (Open Container Initiative). To ogromna inicjatywa, a Helm interesuje si\u0119 ni\u0105 przede wszystkim w celu umieszczania w\u0142asnych chart\u00f3w. Dochodzi do tego, \u017ce na przyk\u0142ad Docker Hub wspiera wiele standard\u00f3w OCI. Nie chc\u0119 niczego przewidywa\u0107, ale by\u0107 mo\u017ce klasyczni dostawcy repozytori\u00f3w Docker zaczn\u0105 oferowa\u0107 mo\u017cliwo\u015b\u0107 umieszczania swoich Helm-chart\u00f3w.<\/p>\n<p>Kontrowersyjna dla mnie kwestia to <strong>wsparcie Lua<\/strong>, jako silnik szablon\u00f3w do pisania skrypt\u00f3w. Nie jestem wielkim fanem Lua, ale to b\u0119dzie ca\u0142kowicie opcjonalna mo\u017cliwo\u015b\u0107. Sprawdzi\u0142em to trzy razy \u2014 u\u017cycie Lua nie b\u0119dzie obowi\u0105zkowe. Dlatego ten, kto chce, mo\u017ce korzysta\u0107 z Lua, a ci, kt\u00f3rzy wol\u0105 Go \u2014 do\u0142\u0105czcie do naszego ogromnego obozu i u\u017cywajcie go-tmpl do tego.<\/p>\n<p>Wreszcie to, czego na pewno mi brakowa\u0142o \u2014 to <strong>pojawienie si\u0119 schemy i walidacja typ\u00f3w danych<\/strong>. Nie b\u0119dzie ju\u017c problem\u00f3w z int czy string, nie b\u0119dzie trzeba opakowywa\u0107 zera w podw\u00f3jne cudzys\u0142owy. Pojawi si\u0119 schema JSON, kt\u00f3ra pozwoli to wyra\u017anie opisa\u0107 dla warto\u015bci.<\/p>\n<p>B\u0119dzie bardzo silnie przepracowany <strong>model oparty na zdarzeniach<\/strong>. Jest ju\u017c konceptualnie opisany. Sprawd\u017acie w w\u0105tku Helm 3 i zobaczycie, ile dodano zdarze\u0144, hook\u00f3w i innych rzeczy, kt\u00f3re znacznie uproszcz\u0105 oraz, z drugiej strony, dodadz\u0105 kontroli nad procesami wdro\u017ceniowymi i ich reakcjami.<\/p>\n<p>Helm 3 b\u0119dzie prostszy, bezpieczniejszy i ciekawszy nie dlatego, \u017ce nie lubimy Helm 2, ale dlatego, \u017ce Kubernetes staje si\u0119 coraz bardziej zaawansowany. W zwi\u0105zku z tym Helm mo\u017ce wykorzysta\u0107 osi\u0105gni\u0119cia Kubernetes i stworzy\u0107 na jego podstawie doskona\u0142e mened\u017cery dla Kubernetes.<\/p>\n<blockquote><p>Jeszcze jedn\u0105 dobr\u0105 wiadomo\u015bci\u0105 jest to, \u017ce <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/moscow\/2019\">DevOpsConf<\/a><\/noindex> Aleksandr Chajorow opowie, <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/moscow\/2019\/abstracts\/5564\">czy kontenery mog\u0105 by\u0107 bezpieczne?<\/a><\/noindex> Przypominamy, \u017ce konferencja po\u015bwi\u0119cona integracji proces\u00f3w rozwoju, testowania i eksploatacji odb\u0119dzie si\u0119 w Moskwie <strong>30 wrze\u015bnia i 1 pa\u017adziernika<\/strong>. Do 20 sierpnia wci\u0105\u017c mo\u017cna <noindex><a rel=\"nofollow\" href=\"https:\/\/conf.ontico.ru\/lectures\/propose\/?conference=dc2019-moscow\">zg\u0142osi\u0107 referat<\/a><\/noindex> i podzieli\u0107 si\u0119 swoim do\u015bwiadczeniem w rozwi\u0105zywaniu <noindex><a rel=\"nofollow\" href=\"https:\/\/devopsconf.io\/moscow\/2019\/articles\/917\">jednego z wielu<\/a><\/noindex> zada\u0144 podej\u015bcia DevOps.<\/p>\n<p>\u015aled\u017a punkty kontrolne konferencji i nowo\u015bci w <noindex><a rel=\"nofollow\" href=\"http:\/\/eepurl.com\/bN_0E1\">newsletterze<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/DevOpsConfChannel\">kanale telegramowym<\/a><\/noindex>.<\/p><\/blockquote>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/462665\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0443\u0442\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0434\u043b\u044f Kubernetes \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u043c\u043e\u0434\u0436\u0438: \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u2014 \u044d\u0442\u043e Helm (\u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 Emoji); \u0437\u0430\u043c\u043e\u043a \u2014 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c; \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u043a \u2014 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 \u0434\u0435\u043b\u0435, \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0436\u0435\u0447\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043f\u043e\u043b\u043e\u043d \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c Helm \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27661,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36918","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0443\u0442\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0434\u043b\u044f Kubernetes \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u043c\u043e\u0434\u0436\u0438: \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u2014 \u044d\u0442\u043e Helm (\u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 Emoji);.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-helm\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c Helm | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0443\u0442\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0434\u043b\u044f Kubernetes \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u043c\u043e\u0434\u0436\u0438: \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u2014 \u044d\u0442\u043e Helm (\u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 Emoji);.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-helm\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:14:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:14:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bezpiecze\u0144stwo Helma | ProHoster","description":"Istot\u0119 opowie\u015bci o najpopularniejszym mened\u017cerze pakiet\u00f3w dla Kubernetes mo\u017cna by przedstawi\u0107 za pomoc\u0105 emoji: pude\u0142ko \u2014 to Helm (to najw\u0142a\u015bciwsze, co znajduje si\u0119 w najnowszej wersji Emoji);","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-helm","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c Helm | ProHoster","og:description":"\u0421\u0443\u0442\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0434\u043b\u044f Kubernetes \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u043c\u043e\u0434\u0436\u0438: \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u2014 \u044d\u0442\u043e Helm (\u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 Emoji);.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/bezopasnost-helm","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:14:43+00:00","article:modified_time":"2019-10-31T19:14:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36918","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 05:19:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:36:25","updated":"2026-01-22 05:19:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/36918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=36918"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/36918\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/27661"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=36918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=36918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=36918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}