<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PostgreSQL návody - Vzdělávejte se s initMAX s.r.o.</title>
	<atom:link href="https://www.initmax.cz/wiki/kapitola/postgresql/postgresql-navody/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.initmax.cz/wiki/kapitola/postgresql/postgresql-navody/</link>
	<description>Nabízíme monitoring všech prvků infrastruktury; správu identit, automatizaci serverů, služeb i aplikací; správu logů, databází a mnoho více.</description>
	<lastBuildDate>Sat, 10 Feb 2024 00:51:39 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>PostgreSQL &#8211; Řízení přístupu prostřednictvím externího autentizačního providera</title>
		<link>https://www.initmax.cz/wiki/rizeni-pristupu-do-postgresql-prostrednictvim-externiho-autentizacniho-providera/</link>
		
		<dc:creator><![CDATA[Tomáš Heřmánek]]></dc:creator>
		<pubDate>Tue, 08 Aug 2023 10:57:38 +0000</pubDate>
				<guid isPermaLink="false">https://www.initmax.cz/?post_type=wiki&#038;p=12807</guid>

					<description><![CDATA[<p>PostgreSQL nabízí několik různých metod ověřování klientů a tentokrát si ukážeme, jak nastavit ověřování pomocí metody GSSAPI, která se obvykle používá ...</p>
<p>The post <a href="https://www.initmax.cz/wiki/rizeni-pristupu-do-postgresql-prostrednictvim-externiho-autentizacniho-providera/">PostgreSQL &#8211; Řízení přístupu prostřednictvím externího autentizačního providera</a> appeared first on <a href="https://www.initmax.cz">initMAX s.r.o.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>PostgreSQL nabízí několik různých metod ověřování klientů a&nbsp;tentokrát si ukážeme, jak nastavit ověřování pomocí metody GSSAPI, která se obvykle používá pro přístup k&nbsp;Microsoft Active Directory nebo FreeIPA.</p>


<section id="block-webinar-block_8a842ba98368cccbcc7240133f1c8f95" data-id="block-webinar-block_8a842ba98368cccbcc7240133f1c8f95" class="gt-block block-webinar">
    <div class="connected-webinars__grid">
        <a href="https://www.initmax.cz/webinar/rizeni-pristupu-do-postgresql-prostrednictvim-externiho-autentizacniho-providera/" class="grid-item">
	<article class="webinar-promotion">
		<div class="webinar-promotion__thumbnail-wrap">
			<figure class="webinar-promotion__thumbnail">
					<img decoding="async" src="https://www.initmax.cz/wp-content/uploads/2023/01/ilustrace_postgresql_02_thumbnail_web.png"
				 width="400"
		 height="250"
		 class=""
		 alt="Řízení přístupu do&nbsp;PostgreSQL prostřednictvím externího autentizačního providera"
		 loading="lazy"	>
									<div class="webinar-promotion__tags">
						<span class="tag tag--small" style="color:#ffffff;background-color:#4caf50;">Nový</span><span class="tag tag--small" style="color:#ffffff;background-color:#336791;">PostgreSQL</span>					</div>
							</figure>
		</div>
		<div class="webinar-promotion__text">
			<div>
									<time datetime="2023-03-15">15.&nbsp;3.&nbsp;2023</time>
							</div>
			<h3 class="webinar-promotion__title">Řízení přístupu do&nbsp;PostgreSQL prostřednictvím externího autentizačního providera</h3>
			<div class="icon-link">
				<figure class="icon-wrap icon-wrap--primary"><svg data-name="Group 3411" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path data-name="Path 455" d="M0,0H24V24H0Z" fill="none"/><path data-name="Path 456" d="M15,10l4.553-2.276A1,1,0,0,1,21,8.618v6.764a1,1,0,0,1-1.447.894L15,14V10Z" transform="translate(0 0)" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><rect data-name="Rectangle 1286" width="12" height="12" rx="2" transform="translate(3.112 6)" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</figure>
				<span>Zhlédnout záznam</span>
			</div>
		</div>
	</article>
</a>    </div>
</section>


<section id="social-links-block_80d736dcb037ccdfe325170cbd99b00c" data-id="social-links-block_80d736dcb037ccdfe325170cbd99b00c" class="gt-block social-links">
			<div class="social-links__content"><p><strong>Dejte nám Like, sdílejte nás nebo nás sledujte 😍</strong><br />
Ať vám nic neunikne:</p>
</div>
		<div class="socials df df--fw-w df--ai-c df--jc-c">
					<a href="https://twitter.com/initmax" title="Odkaz na Twitter" class="social-link social-link--colored twitter-x" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 4l11.733 16h4.267l-11.733 -16z" /><path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" /></svg>


</a>
							<a href="https://www.linkedin.com/company/initmax/" title="Odkaz na Linkedin" class="social-link social-link--colored linkedin" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g data-name="Group 3318" transform="translate(-4214 7797)"><g data-name="Group 2185" transform="translate(4214 -7797)"><path data-name="Path 524" d="M0,0H24V24H0Z" fill="none"/><rect data-name="Rectangle 1825" width="16" height="16" rx="2" transform="translate(4 4)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 64" y2="5" transform="translate(8 11)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 65" y2="0.01" transform="translate(8 8)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 66" y1="5" transform="translate(12 11)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 525" d="M16,16V13a2,2,0,0,0-4,0" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></g></g></svg>
</a>
									<a href="https://www.youtube.com/@initmax1" title="Odkaz na Youtube" class="social-link social-link--colored youtube" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-youtube" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 5m0 4a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v6a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4z" /><path d="M10 9l5 3l-5 3z" /></svg>


</a>
										<a href="https://github.com/initmax" title="Odkaz na GitHub" class="social-link social-link--colored github" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg>


</a>
								<a href="https://www.facebook.com/initmax" title="Odkaz na Facebook" class="social-link social-link--colored facebook" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g data-name="Group 3193" transform="translate(-4286 7797)"><g data-name="Group 3189"><path data-name="Path 515" d="M0,0H24V24H0Z" transform="translate(4286 -7797)" fill="none"/><path data-name="Path 516" d="M7,10v4h3v7h4V14h3l1-4H14V8a1,1,0,0,1,1-1h3V3H15a5,5,0,0,0-5,5v2H7" transform="translate(4286 -7797)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></g></g></svg>
</a>
							<a href="https://www.instagram.com/initmax/" title="Odkaz na Instagram" class="social-link social-link--colored instagram" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g data-name="Group 3194" transform="translate(-4358 7797)"><g data-name="Group 3190"><path data-name="Path 517" d="M0,0H24V24H0Z" transform="translate(4358 -7797)" fill="none"/><rect data-name="Rectangle 1783" width="16" height="16" rx="4" transform="translate(4362 -7793)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><circle data-name="Ellipse 51" cx="3" cy="3" r="3" transform="translate(4367 -7788)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 63" y2="0.001" transform="translate(4374.5 -7789.5)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></g></g></svg>
</a>
			</div>
</section>




<h2 class="wp-block-heading">Základní požadavky</h2>



<p>Zde je výčet základních požadavků pro funkční nastavení ověřování uživatelů z&nbsp;Active Directory v&nbsp;PostgreSQL pomocí Kerberos (GSS):</p>



<ol class="wp-block-list">
<li>nainstalovaný server PostgreSQL</li>



<li>nainstalovou podporu a&nbsp;nastavení pro Kerberos na&nbsp;DB serveru</li>



<li>uživatelský účet v&nbsp;Active Directory pro PostgreSQL</li>



<li>vytvořený Kerberos keytab pro uživatele v&nbsp;Active Directory</li>



<li>nastavený PostgreSQL pro Kerberos a&nbsp;GSSAPI</li>



<li>uživatelský účet v&nbsp;PostgreSQL totožný s&nbsp;účtem v&nbsp;Active Directory (nebo ldap2pg)</li>



<li>ověřovací Kerberos ticket pro DB uživatele v&nbsp;Active Directory</li>
</ol>



<h2 class="wp-block-heading">Instalace a&nbsp;konfigurace Kerberos</h2>



<p>Nejprve na&nbsp;databázovém serveru nainstalujeme základní balíčky, které obsahují knihovny, a&nbsp;binární i&nbsp;konfigurační soubory pro podporu Kerberos.</p>


<section id="block-code-block_733157bfeb040998adca461711ed55ed" data-id="block-code-block_733157bfeb040998adca461711ed55ed" class="gt-block block-code">
    <pre><code>dnf install krb5-server krb5-workstation</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>V případě, že chceme používat k&nbsp;autentizaci Kerberos i&nbsp;na&nbsp;samotném klientu (potažmo serveru), je potřeba mít zde i&nbsp;správně nastavený Kerberos. </p>



<p>Ovšem PostgreSQL samotný toto nastavení pro funkční ověřování uživatelů nepotřebuje. </p>



<p>Kerberos se na&nbsp;úrovni OS nastavuje v&nbsp;konfiguračním souboru <code>/etc/krb5.conf</code> a&nbsp;tento soubor může upravovat pouze privilegovaný uživatel <code>root</code>. </p>



<p>Vzorová konfigurace může kupříkladu vypadat následovně:</p>


<section id="block-code-block_adc4cdbafa0593e680442054c177953d" data-id="block-code-block_adc4cdbafa0593e680442054c177953d" class="gt-block block-code">
    <pre><code>[logging]
default = /var/log/krb5libs.log
kdc = /var/log/krb5kdc.log
admin_server = /var/log/kadmind.log

[libdefaults]
default_realm = DEMO.INITMAX.CZ
dns_lookup_realm = false
# ticket_lifetime = 24h
# renew_lifetime = 7d
forwardable = true
udp_preference_limit = 1
default_ccache_name = KEYRING:persistent:%{uid}

[realms]
DEMO.INITMAX.CZ = {
kdc = demo.initmax.cz
admin_server = demo.initmax.cz
}

[domain_realm]
.demo.initmax.cz = DEMO.INITMAX.CZ
demo.initmax.cz = DEMO.INITMAX.CZ</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<h2 class="wp-block-heading">Uživatelský účet v&nbsp;Active Directory</h2>



<p>Na úrovni Active Directory běžným způsobem vytvoříme servisní účet, který v&nbsp;našem případě nazveme <code>pg_db_srv01</code>.</p>



<p>A následně vytvoříme níže zobrazeným příkazem tzv.&nbsp;Kerberos keytab, který k&nbsp;tomuto servisnímu účtu přiřadíme.</p>


<section id="block-code-block_210bb34cbd23db2f9976908afaa5b725" data-id="block-code-block_210bb34cbd23db2f9976908afaa5b725" class="gt-block block-code">
    <pre><code>ktpass –princ POSTGRES/pgsql.demo.initmax.cz@DEMO.INITMAX.CZ -pass %heslo% -mapuser pg_db_srv01 -crypto ALL -ptype KRB5_NT_Principal -out pgsql.demo.initmax.cz.keytab</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Takto vzniklý Kerberos keytab si zkopírujeme a&nbsp;přesuneme ho na&nbsp;klienta, v&nbsp;našem případě tedy na&nbsp;databázový server, například do&nbsp;složky <code>/etc</code>.</p>



<p>Přímo na&nbsp;databázovém serveru si pak můžeme ověřit, že vytvořený keytab skutečně funguje, a&nbsp;to následujícím příkazem:</p>


<section id="block-code-block_947b899a201499620d714d941753940e" data-id="block-code-block_947b899a201499620d714d941753940e" class="gt-block block-code">
    <pre><code>kinit -k -t /etc/pgsql.demo.initmax.cz.keytab POSTGRES/pgsql.demo.initmax.cz@DEMO.INITMAX.CZ -V</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Pokud nám příkaz <code>kinit</code> na&nbsp;konci svého běhu ve výstupu zobrazí hlášku <code>Authenticated to Kerberos</code>, pak je keytab funkční a&nbsp;my můžeme překročit ke konfiguraci samotného PostgreSQL.</p>



<p>Vzorový výstup výše zmíněného příkazu <code>kinit</code> s&nbsp;funkčním souborem keytab můžete vidět zde:</p>


<section id="block-code-block_07e9f81db4a30cfcb056123d2eb84fbd" data-id="block-code-block_07e9f81db4a30cfcb056123d2eb84fbd" class="gt-block block-code">
    <pre><code>Using existing cache: 0
Using principal: POSTGRES/pgsql.demo.initmax.cz@DEMO.INITMAX.CZ
Using keytab: /etc/pgsql.demo.initmax.cz.keytab
Authenticated to Kerberos v5</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<h2 class="wp-block-heading">Konfigurace PostgreSQL</h2>



<p>Nejprve upravíme konfigurační soubor PostgreSQL (<code>postgresql.conf</code>) tak, aby věděl, kde mu leží náš Kerberos keytab a&nbsp;tudíž ho korektně načetl a&nbsp;použil.</p>



<p>K tomu slouží následující konfigurační direktiva <code>krb_server_keyfile</code>, jejíž hodnotu naplníme absolutní cestou ke Kerberos keytabu. </p>



<p>V našem případě tedy <code>/etc/pgsql.demo.initmax.cz.keytab</code>.</p>


<section id="block-code-block_c04a6eb2dd22889ba59dc2e106149617" data-id="block-code-block_c04a6eb2dd22889ba59dc2e106149617" class="gt-block block-code">
    <pre><code>krb_server_keyfile=/etc/pgsql.demo.initmax.cz.keytab</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Následně v&nbsp;konfiguračním souboru nastavujícím přístupy, tedy <code>pg_hba.conf</code> povolíme lokální i&nbsp;vzdálené ověřování pomocí metody GSSAPI se správně nastaveným Kerberos realm.</p>


<section id="block-code-block_6b0a6c172c4655b4ec19939f51f167b2" data-id="block-code-block_6b0a6c172c4655b4ec19939f51f167b2" class="gt-block block-code">
    <pre><code># IPv4 local connections:
#host all all 127.0.0.1/32 ident
host all all 0.0.0.0/0 gss include_realm=0 krb_realm=DEMO.INITMAX.CZ</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Poté se připojíme k&nbsp;serveru pomocí <code>psql</code> a&nbsp;vytvoříme uživatele na&nbsp;úrovní samotného PostgreSQL a&nbsp;nastavíme mu požadováná oprávnění.</p>



<p><strong>Pozor!</strong> Tento uživatel musí odpovídat skutečnému uživatli v&nbsp;Active Directory!</p>


<section id="block-code-block_353b9569da0a34cfa39275e61319e58b" data-id="block-code-block_353b9569da0a34cfa39275e61319e58b" class="gt-block block-code">
    <pre><code>create user &quot;ad_user&quot; superuser;</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Jako další krok můžeme konzoli psql opustit a&nbsp;příkazem <code>kinit</code> získáme (po&nbsp;zadání správného hesla) ověřovací ticket pro našeho uživatele z&nbsp;Active Directory serveru:</p>


<section id="block-code-block_b4f2e72007b584f1d6f43ece8177bd64" data-id="block-code-block_b4f2e72007b584f1d6f43ece8177bd64" class="gt-block block-code">
    <pre><code>kinit ad_user</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>A v&nbsp;tuto chvíli se již pod tímto uživatelem můžeme přihlásit přímo do&nbsp;PostgreSQL bez nutnosti zadání hesla, jelikož se pro ověření použije ticket, získaný výše.</p>


<section id="block-code-block_156ec1a92e4a0458dc332f9d712bb879" data-id="block-code-block_156ec1a92e4a0458dc332f9d712bb879" class="gt-block block-code">
    <pre><code>psql -U &quot;ad_user&quot; -h csas-pgsql.win.initmax.cz postgres</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Nespornou nevýhodou tohoto nativního řešení pak (v&nbsp;závislosti na&nbsp;velikosti prostředí) zůstává nutnost uživatele ručně vytvářet na&nbsp;úrovni PostgreSQL.</p>



<p>Tyto činnosti je však možné zautomatizovat, a&nbsp;to pomocí <code>ldap2pg</code>, na&nbsp;což se podíváme v&nbsp;následující kapitole.</p>



<h2 class="wp-block-heading">ldap2pg</h2>



<p>Toto je nástroj, který na&nbsp;základě předem nastavených parametrů automatizuje vytváření, aktualizaci i&nbsp;odebírání rolí na&nbsp;PostgreSQL podle nastavení v&nbsp;LDAP.</p>



<p>ldap2pg je skript napsaný v&nbsp;jazyku Python, a&nbsp;pro svůj běh vyžaduje kromě Pythonu samotného (v2.6+ nebo v3.4+) i&nbsp;další závislé balíčky.</p>



<p>Konkrétně to jsou <code>Pyyaml</code>, <code>python-ldap</code> a&nbsp;<code>python-psycopg2</code>. </p>



<h3 class="wp-block-heading">Instalace</h3>



<p>Doporučovaná metoda instalace je v&nbsp;případě RHEL přímo z&nbsp;oficiálního repozitáře PostgreSQL (PGDG) a&nbsp;v&nbsp;případě Debian pak pomocí <code>pip</code>.</p>



<p>Pokud chceme balíčky co nejaktuálnější, pak využijeme přímo repozitář Dalibo labs.</p>



<p>V našem případě používáme Rocky Linux 9 a&nbsp;tudíž si oficiální repozitář Dalibo labs přidáme následujícím příkazem a&nbsp;následně obnovíme <code>dnf</code> cache.</p>


<section id="block-code-block_d95d9e59d3c9d9cb864d32e3838ae302" data-id="block-code-block_d95d9e59d3c9d9cb864d32e3838ae302" class="gt-block block-code">
    <pre><code>dnf install -y https://yum.dalibo.org/labs/dalibo-labs-4-1.noarch.rpm
dnf makecache fast</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Další možností je vytvoření repozitáře ručně. To uděláme tak, že vytvoříme nový soubor /etc/yum.repos.d/dalibolabs.repo a&nbsp;ten naplníme následujícím obsahem:</p>


<section id="block-code-block_618bf32e2438292f542090c3e806b511" data-id="block-code-block_618bf32e2438292f542090c3e806b511" class="gt-block block-code">
    <pre><code>[dalibolabs]
name = Dalibo Labs - RHEL/CentOS/Rockylinux $releasever - $basearch
baseurl = https://yum.dalibo.org/labs/RHEL$releasever-$basearch
gpgcheck = 1
enabled = 1</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Soubor uložíme a&nbsp;zaktualizujeme <code>dnf</code> cache:</p>


<section id="block-code-block_a5863358f2693448db60a983d8e9d7b6" data-id="block-code-block_a5863358f2693448db60a983d8e9d7b6" class="gt-block block-code">
    <pre><code>dnf makecache fast</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Potom, co máme přidaný repozitář, můžeme přejít k&nbsp;samotné instalaci ldap2pg a&nbsp;všech jeho závislostí:</p>


<section id="block-code-block_eb935a1ccba52d7bdf98da9216cd2ee9" data-id="block-code-block_eb935a1ccba52d7bdf98da9216cd2ee9" class="gt-block block-code">
    <pre><code>dnf install ldap2pg</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Jakmile máme ldap2pg úspěšně nainstalován, tak můžeme překročit k&nbsp;jeho konfiguraci.</p>



<h3 class="wp-block-heading">Nastavení</h3>



<p>ldap2pg standardně vyhledává svůj konfigurační soubor v&nbsp;těchto cestách: </p>



<ul class="wp-block-list">
<li><strong>ldap2pg.yml</strong> v&nbsp;aktuálním pracovním adresáři</li>



<li><strong>~/.config/ldap2pg.yml</strong></li>



<li><strong>/etc/ldap2pg.yml</strong></li>
</ul>



<p>Lze však nastavit i&nbsp;cestu vlastní a&nbsp;to spuštění ldap2pg s&nbsp;parametrem <code>--config</code>, toto lze využít například pro spuštění několika instancí <code>ldap2pg</code> s&nbsp;různými konfiguračními soubory.</p>



<p>Zde můžete pro ukázku vidět příklad takové konfigurace:</p>


<section id="block-code-block_b707fc1555abe24444ae8dee9c335431" data-id="block-code-block_b707fc1555abe24444ae8dee9c335431" class="gt-block block-code">
    <pre><code>postgres:
  dsn: postgres://alfa@csas-pgsql.win.initmax.cz:5432/postgres
  roles_blacklist_query:
  - postgres
  - &quot;pg_*&quot;
  - &quot;rds_*&quot;

ldap:
  uri: ldap://dc1.win.initmax.cz
  binddn: CN=Test User Alfa,OU=Users,OU=testAcounts,DC=win,DC=initmax,DC=cz
  password: &quot;%heslo%&quot;

sync_map:
- role:
  name: alfa
  options: LOGIN SUPERUSER
  names:
  - ad_roles
  comment: &quot;LDAP role managed by ldap2pg.&quot;

- ldapsearch:
    base: CN=pg_DBA_users,OU=Groups,OU=testAcounts,DC=win,DC=initmax,DC=cz
  role:
    name: &#039;dba_{member.samaccountname}&#039;
    options: LOGIN SUPERUSER
    parent: ad_roles
    comment: &quot;Synced from AD: {dn}&quot;

- ldapsearch:
    base: CN=pg_RO_users,OU=Groups,OU=testAcounts,DC=win,DC=initmax,DC=cz
  role:
    name: &#039;{member.samaccountname}&#039;
    options: LOGIN
    parent: ad_roles
    comment: &quot;Synced from AD: {dn}&quot;</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>Tento ukázkový konfigurační soubor obsahuje několik částí. </p>



<p>V části <code>postgres:</code> definujeme připojení k&nbsp;databázovému serveru a&nbsp;k&nbsp;databázi, včetně přihlašovacích údajů. Z&nbsp;bezpečnostních důvodů doporučujeme přihlašovací heslo v&nbsp;konfiguračním souboru nepoužívat, ale namísto toho uživatele ověřovat přes Kerberos ticket, jak je ukázáno právě v&nbsp;tomto návodu. Součástí této sekce je i&nbsp;direktiva <code>roles_blacklist_query:</code> nám určuje seznam lokálních rolí v&nbsp;PostgreSQL, které bude ldap2pg ignorovat. Povšimněte si možnosti využití zástupných znaků. </p>



<p>V části <code>ldap:</code> definujeme připojení k&nbsp;Active Directory, nebo jinému LDAP serveru. Tato sekce je v&nbsp;tomto konfiguračním souboru volitelná a&nbsp;informace o&nbsp;nastavení LDAP si nástroj <code>ldap2pg</code> umí načíst i&nbsp;z&nbsp;jakéhokoliv standardního umístění těchto systémových konfiguračních souborů (např.&nbsp;<code>/etc/ldap.conf</code>), kde je záhodno mít případně uloženo i&nbsp;heslo pro bind uživatel v&nbsp;LDAP.</p>



<p>Poslední sekci <code>sync_map:</code> pak používáme k&nbsp;mapování uživatelů a&nbsp;rolí. Na&nbsp;jejím začátku definujeme příklad lokální, statické role pro admin uživatele &#8222;alfa&#8220; s&nbsp;právém přihlásit se a&nbsp;rolí <code>SUPER USER</code>. Zároveň v&nbsp;této sekci vytváříme uživatelskou roli <code>ad_roles</code>, do&nbsp;které následně přiřazujeme další, automaticky vytvořené uživatele pomocí ldap2pg (a&nbsp;této roli je vytvořen i&nbsp;takto formulovaný komentář). V&nbsp;podsekcích <code>ldapsearch:</code> pak definujeme jednotlivá <code>BaseDN</code>, tedy cesty ve struktuře LDAP, kde má <code>ldap2pg</code> uživatele hledat. Vzorově zde vytváříme databázové administrátory (ze skupiny <code>pg_DBA_users</code>) a&nbsp;uživatele pro čtení (ze skupiny <code>pg_RO_users</code>) s&nbsp;jejich příslušnými oprávěními a&nbsp;komentáři. Jako nadřazenou roli mají <code>ad_roles</code>, kterou jsme si definovali v&nbsp;předchozí podsekci.</p>



<h3 class="wp-block-heading">Testování a&nbsp;spuštění</h3>



<p>Nespornou výhodou nástoje <code>ldap2pg</code> je rovněž možnost si vytvořené nastavení nanečisto otestovat (tzv.&nbsp;dry run), a&nbsp;to pomocí spouštěcího parametru <code>--dry</code>, jehož výstup s&nbsp;naší vzorovou konfigurací můžete vidět zde:</p>


<section id="block-code-block_9c9fe1c972e733f2923451401e4f6f53" data-id="block-code-block_9c9fe1c972e733f2923451401e4f6f53" class="gt-block block-code">
    <pre><code>Starting ldap2pg 5.8.
Using /root/ldap2pg.yml.
Connecting to LDAP server ldap://dc1.win.initmax.cz.
Trying simple bind.
Running in dry mode. Postgres will be untouched.
Inspecting roles in Postgres cluster...
Querying LDAP CN=pg_DBA_users,OU=Group... (objectClass...
Missing &#039;member&#039; from CN=pg_DBA_users,OU=Groups,OU=testAcounts,DC=win,DC=initmax,DC=cz.
Considering it as an empty list.
Querying LDAP CN=pg_RO_users,OU=Groups... (objectClass...
Missing &#039;member&#039; from CN=pg_RO_users,OU=Groups,OU=testAcounts,DC=win,DC=initmax,DC=cz. Considering
it as an empty list.
Nothing to do.
Comparison complete.</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>V případě, že test proběhl úspěšně, pak <code>ldap2pg</code> spustíme s&nbsp;parametrem <code>--real</code>, který už námi otestovanou konfiguraci přímo projeví konkrétními změnami v&nbsp;PostgreSQL.</p>



<p>Pro tento příkaz pak stačí už jen vytvořit pravidelně spouštěnou úlohu, například pomocí <code>cron</code>.</p>


<section id="block-code-block_cc05f91a18e419c12c3976dbe675697d" data-id="block-code-block_cc05f91a18e419c12c3976dbe675697d" class="gt-block block-code">
    <pre><code>ldap2pg --real</code></pre>
    <a onclick="copyCode(this)" class="block-code__copy" title="Kopírovat"><svg data-name="Group 3002" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><rect data-name="Rectangle 2035" width="12" height="12" rx="2" transform="translate(8 8)" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 607" d="M16,8V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v8a2,2,0,0,0,2,2H8" fill="none" stroke="#1f65f4" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</a>
</section>




<p>V tuto chvíli tak máme funkční ověřování uživatelů do&nbsp;PostgreSQL pomocí Kerberos, včetně automatizace jejich správy z&nbsp;údajů v&nbsp;Active Directory, a&nbsp;to pomocí nástroje ldap2pg.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<section id="block-newsletter-block_3ef25ff884be261f88dafeaab0c10c88" data-id="block-newsletter-block_3ef25ff884be261f88dafeaab0c10c88" class="gt-block block-newsletter">
    <section id="newsletter" class="newsletter">
	<div class="gradient basic">
		<div class="newsletter__inner width width--general">
			<div class="col left">
									<h2 class="newsletter__title">Buďte v&nbsp;obraze s&nbsp;naším newsletterem</h2>
													<div class="newsletter__content"><p>Díky initMAX newsletteru Vám neunikne žádná z&nbsp;pozvánek na&nbsp;akce a&nbsp;webináře, žádný z&nbsp;tipů, jak dostat ze svého IT MAXimum, ani ověřené informace o&nbsp;novinkách ze světa Zabbix a&nbsp;dalších technologií.</p>
</div>
							</div>
			<div class="col right form-wrapper">
				<div class="newsletter-form">
	<form method="post" action="/wiki/kapitola/postgresql/postgresql-navody/feed/" enctype="multipart/form-data">
		<input type="hidden" name="url" value="https://www.initmax.cz/wiki/kapitola/postgresql/postgresql-navody/feed/">

		<div class="inputs">

			<label for="newsletter-form_contact_email" class="top">Vaše e-mailová adresa:</label>
			<div class="df">

				<div class="input">
					<input type="text" id="newsletter-form_contact_email" name="newsletter_email" placeholder="@" data-format="email" data-required="1">
									</div><!-- /.input -->

				<a href="#" class="btn btn--white sendBtn">Odeslat</a>

			</div>

			<div class="bottom nm">
				<label for="newsletter-form_gdpr" class="checkbox gdpr">
					<input type="checkbox" id="newsletter-form_gdpr" name="newsletter_gdpr">
					<span>Souhlasím se&nbsp;<a href="https://www.initmax.cz/ochrana-osobnich-udaju/" target="_blank">zpracováním osobních údajů</a>.</span>
				</label>
			</div>

		</div><!-- /.inputs -->
		<div class="sent hidden">
			<div class="iconOk"><h3>Děkujeme, že jste se přihlásili k&nbsp;odběru našeho newsletteru.</h3>
</div>
			<button class="sent__close" title="Zavřít" onclick="closeFormMessage(this,event)"><svg data-name="Group 3602" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path data-name="Path 3272" d="M0,0H24V24H0Z" fill="none"/><line data-name="Line 98" y2="14" transform="translate(7.05 7.05) rotate(-45)" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 99" x2="14" transform="translate(7.05 16.95) rotate(-45)" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg>
</button>
		</div><!-- /.sent -->
	</form>
</div>			</div>
		</div>
	</div>
</section></section>



<section id="social-links-block_80d736dcb037ccdfe325170cbd99b00c" data-id="social-links-block_80d736dcb037ccdfe325170cbd99b00c" class="gt-block social-links">
			<div class="social-links__content"><p><strong>Dejte nám Like, sdílejte nás nebo nás sledujte 😍</strong><br />
Ať vám nic neunikne:</p>
</div>
		<div class="socials df df--fw-w df--ai-c df--jc-c">
					<a href="https://twitter.com/initmax" title="Odkaz na Twitter" class="social-link social-link--colored twitter-x" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 4l11.733 16h4.267l-11.733 -16z" /><path d="M4 20l6.768 -6.768m2.46 -2.46l6.772 -6.772" /></svg>


</a>
							<a href="https://www.linkedin.com/company/initmax/" title="Odkaz na Linkedin" class="social-link social-link--colored linkedin" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g data-name="Group 3318" transform="translate(-4214 7797)"><g data-name="Group 2185" transform="translate(4214 -7797)"><path data-name="Path 524" d="M0,0H24V24H0Z" fill="none"/><rect data-name="Rectangle 1825" width="16" height="16" rx="2" transform="translate(4 4)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 64" y2="5" transform="translate(8 11)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 65" y2="0.01" transform="translate(8 8)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 66" y1="5" transform="translate(12 11)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><path data-name="Path 525" d="M16,16V13a2,2,0,0,0-4,0" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></g></g></svg>
</a>
									<a href="https://www.youtube.com/@initmax1" title="Odkaz na Youtube" class="social-link social-link--colored youtube" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-youtube" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M3 5m0 4a4 4 0 0 1 4 -4h10a4 4 0 0 1 4 4v6a4 4 0 0 1 -4 4h-10a4 4 0 0 1 -4 -4z" /><path d="M10 9l5 3l-5 3z" /></svg>


</a>
										<a href="https://github.com/initmax" title="Odkaz na GitHub" class="social-link social-link--colored github" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /></svg>


</a>
								<a href="https://www.facebook.com/initmax" title="Odkaz na Facebook" class="social-link social-link--colored facebook" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g data-name="Group 3193" transform="translate(-4286 7797)"><g data-name="Group 3189"><path data-name="Path 515" d="M0,0H24V24H0Z" transform="translate(4286 -7797)" fill="none"/><path data-name="Path 516" d="M7,10v4h3v7h4V14h3l1-4H14V8a1,1,0,0,1,1-1h3V3H15a5,5,0,0,0-5,5v2H7" transform="translate(4286 -7797)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></g></g></svg>
</a>
							<a href="https://www.instagram.com/initmax/" title="Odkaz na Instagram" class="social-link social-link--colored instagram" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g data-name="Group 3194" transform="translate(-4358 7797)"><g data-name="Group 3190"><path data-name="Path 517" d="M0,0H24V24H0Z" transform="translate(4358 -7797)" fill="none"/><rect data-name="Rectangle 1783" width="16" height="16" rx="4" transform="translate(4362 -7793)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><circle data-name="Ellipse 51" cx="3" cy="3" r="3" transform="translate(4367 -7788)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line data-name="Line 63" y2="0.001" transform="translate(4374.5 -7789.5)" fill="none" stroke="var(--icon-color,#1F65F4)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></g></g></svg>
</a>
			</div>
</section>

<p>The post <a href="https://www.initmax.cz/wiki/rizeni-pristupu-do-postgresql-prostrednictvim-externiho-autentizacniho-providera/">PostgreSQL &#8211; Řízení přístupu prostřednictvím externího autentizačního providera</a> appeared first on <a href="https://www.initmax.cz">initMAX s.r.o.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
