<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>The <strong>Security & Compliance</strong> category encompasses comprehensive documentation for protecting your Geode graph database and meeting regulatory requirements. From transport encryption and authentication through data-at-rest protection and audit logging, these resources cover the full security stack required for enterprise deployments.</p>
<h3 id="introduction" class="position-relative d-flex align-items-center group">
<span>Introduction</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="introduction"
aria-haspopup="dialog"
aria-label="Share link: Introduction">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Enterprise databases handle sensitive data requiring multiple layers of protection. Geode provides defense-in-depth security with encryption at every layer, fine-grained access controls, and comprehensive audit logging. Transport security uses mandatory TLS 1.3 with no plaintext fallback. Data-at-rest encryption protects stored data with both Transparent Data Encryption (TDE) and Field-Level Encryption (FLE). Row-Level Security (RLS) policies enforce fine-grained access control at the data level. Audit logging captures all data access for compliance and forensics.</p>
<p>Security in Geode isn’t an afterthought or optional feature—it’s built into the architecture from the ground up. The QUIC transport protocol mandates TLS 1.3 encryption, eliminating the possibility of accidentally running unencrypted. Authentication uses Argon2id password hashing, the most secure algorithm available. KMS integration enables enterprise key management with automatic key rotation. These design choices reflect a security-first philosophy where secure defaults and defense-in-depth protect your data.</p>
<h3 id="what-youll-find" class="position-relative d-flex align-items-center group">
<span>What You&rsquo;ll Find</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="what-youll-find"
aria-haspopup="dialog"
aria-label="Share link: What Youll Find">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="transport-security" class="position-relative d-flex align-items-center group">
<span>Transport Security</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="transport-security"
aria-haspopup="dialog"
aria-label="Share link: Transport Security">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Mandatory TLS 1.3</strong></p>
<ul>
<li>All connections require TLS 1.3 encryption</li>
<li>No plaintext fallback option</li>
<li>QUIC protocol with integrated encryption</li>
<li>Perfect forward secrecy for all connections</li>
<li>Modern cipher suites only (no weak algorithms)</li>
<li>Certificate-based server authentication</li>
<li>Mutual TLS (mTLS) support for client authentication</li>
</ul>
<p><strong>Connection Security</strong></p>
<ul>
<li>Connection migration with security preservation</li>
<li>0-RTT resumption with replay protection</li>
<li>Certificate pinning for MITM prevention</li>
<li>Hostname verification and validation</li>
<li>SNI (Server Name Indication) support</li>
<li>OCSP stapling for certificate validation</li>
</ul>
<h4 id="authentication--authorization" class="position-relative d-flex align-items-center group">
<span>Authentication &amp; Authorization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="authentication--authorization"
aria-haspopup="dialog"
aria-label="Share link: Authentication &amp; Authorization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>User Authentication</strong></p>
<ul>
<li>Argon2id password hashing (memory-hard, GPU-resistant)</li>
<li>Configurable work factors for future-proofing</li>
<li>Username/password authentication</li>
<li>Certificate-based authentication (mTLS)</li>
<li>Token-based authentication</li>
<li>Session management with secure tokens</li>
<li>Multi-factor authentication (MFA) support</li>
</ul>
<p><strong>Authorization Model</strong></p>
<ul>
<li>Role-Based Access Control (RBAC)</li>
<li>Graph-level permissions</li>
<li>Label-level access control</li>
<li>Property-level visibility</li>
<li>Relationship-type permissions</li>
<li>Function and procedure access control</li>
<li>Administrative privilege separation</li>
</ul>
<p><strong>Row-Level Security (RLS)</strong></p>
<ul>
<li>Fine-grained access control at data level</li>
<li>Policy-based filtering using GQL expressions</li>
<li>User and role-based policies</li>
<li>Transparent query rewriting</li>
<li>Performance-optimized policy evaluation</li>
<li>Policy composition and inheritance</li>
<li>Audit trail for policy violations</li>
</ul>
<h4 id="data-at-rest-encryption" class="position-relative d-flex align-items-center group">
<span>Data-at-Rest Encryption</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="data-at-rest-encryption"
aria-haspopup="dialog"
aria-label="Share link: Data-at-Rest Encryption">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Transparent Data Encryption (TDE)</strong></p>
<ul>
<li>Full database encryption with no schema changes</li>
<li>AES-256-GCM authenticated encryption</li>
<li>Key hierarchy: master key -> database key -> page keys</li>
<li>KMS integration (AWS KMS, Azure Key Vault, HashiCorp Vault)</li>
<li>Automatic key rotation with online re-encryption</li>
<li>No performance impact on reads (hardware AES acceleration)</li>
<li>Backup encryption included automatically</li>
</ul>
<p><strong>Field-Level Encryption (FLE)</strong></p>
<ul>
<li>Selective encryption of sensitive fields</li>
<li>Client-side or server-side encryption</li>
<li>Deterministic encryption for equality searches</li>
<li>Randomized encryption for maximum security</li>
<li>Per-field encryption keys</li>
<li>Key derivation from master secrets</li>
<li>Queryable encryption patterns</li>
</ul>
<p><strong>Key Management</strong></p>
<ul>
<li>KMS integration for enterprise key management</li>
<li>Automatic key rotation schedules</li>
<li>Key versioning and rollback</li>
<li>Secure key derivation (HKDF-SHA256)</li>
<li>Hardware Security Module (HSM) support</li>
<li>Key lifecycle management</li>
<li>Key revocation and emergency rotation</li>
</ul>
<h4 id="audit-logging" class="position-relative d-flex align-items-center group">
<span>Audit Logging</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="audit-logging"
aria-haspopup="dialog"
aria-label="Share link: Audit Logging">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Comprehensive Audit Trail</strong></p>
<ul>
<li>All data access logged (SELECT, INSERT, UPDATE, DELETE)</li>
<li>Schema changes captured (CREATE, ALTER, DROP)</li>
<li>Authentication events (login, logout, failed attempts)</li>
<li>Authorization failures (permission denied)</li>
<li>Configuration changes tracked</li>
<li>Administrative operations logged</li>
<li>Query execution history</li>
</ul>
<p><strong>Audit Log Features</strong></p>
<ul>
<li>Immutable append-only log</li>
<li>Tamper-evident with cryptographic hashing</li>
<li>Structured log format (JSON)</li>
<li>Real-time streaming to SIEM systems</li>
<li>Configurable retention policies</li>
<li>Compliant log format for regulations</li>
<li>Async logging for minimal performance impact</li>
</ul>
<p><strong>Compliance Reporting</strong></p>
<ul>
<li>Pre-built compliance reports (GDPR, SOC 2, HIPAA)</li>
<li>User access reports</li>
<li>Data modification reports</li>
<li>Sensitive data access reports</li>
<li>Anomaly detection and alerting</li>
<li>Audit log search and analysis</li>
<li>Export to compliance platforms</li>
</ul>
<h4 id="compliance-features" class="position-relative d-flex align-items-center group">
<span>Compliance Features</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="compliance-features"
aria-haspopup="dialog"
aria-label="Share link: Compliance Features">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Regulatory Compliance</strong></p>
<ul>
<li>GDPR (General Data Protection Regulation)</li>
<li>HIPAA (Health Insurance Portability and Accountability Act)</li>
<li>SOC 2 (System and Organization Controls)</li>
<li>PCI DSS (Payment Card Industry Data Security Standard)</li>
<li>CCPA (California Consumer Privacy Act)</li>
<li>ISO 27001 information security management</li>
</ul>
<p><strong>Data Privacy</strong></p>
<ul>
<li>Right to erasure (data deletion)</li>
<li>Right to access (data export)</li>
<li>Data minimization support</li>
<li>Purpose limitation enforcement</li>
<li>Consent management with RLS</li>
<li>Data retention policies</li>
<li>Anonymization and pseudonymization</li>
</ul>
<h3 id="use-cases-with-code-examples" class="position-relative d-flex align-items-center group">
<span>Use Cases with Code Examples</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="use-cases-with-code-examples"
aria-haspopup="dialog"
aria-label="Share link: Use Cases with Code Examples">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="implementing-row-level-security" class="position-relative d-flex align-items-center group">
<span>Implementing Row-Level Security</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="implementing-row-level-security"
aria-haspopup="dialog"
aria-label="Share link: Implementing Row-Level Security">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">setup_rls_policies</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Set up RLS policies for multi-tenant application."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Create policy: users can only see their own data</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE POLICY user_isolation ON Person
</span></span></span><span class="line"><span class="cl"><span class="s2"> FOR SELECT
</span></span></span><span class="line"><span class="cl"><span class="s2"> USING (owner_id = current_user_id())
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Create policy: managers can see their team's data</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE POLICY manager_access ON Person
</span></span></span><span class="line"><span class="cl"><span class="s2"> FOR SELECT
</span></span></span><span class="line"><span class="cl"><span class="s2"> USING (
</span></span></span><span class="line"><span class="cl"><span class="s2"> owner_id = current_user_id()
</span></span></span><span class="line"><span class="cl"><span class="s2"> OR EXISTS {
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (manager:User {id: current_user_id()})
</span></span></span><span class="line"><span class="cl"><span class="s2"> -[:MANAGES]->(team:Team)<-[:MEMBER_OF]-(user:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE user.id = owner_id
</span></span></span><span class="line"><span class="cl"><span class="s2"> }
</span></span></span><span class="line"><span class="cl"><span class="s2"> )
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Create policy: admins see everything</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE POLICY admin_access ON Person
</span></span></span><span class="line"><span class="cl"><span class="s2"> FOR ALL
</span></span></span><span class="line"><span class="cl"><span class="s2"> USING (current_user_role() = 'admin')
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Query data with RLS enforcement</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_customer_data</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Get customer data - RLS policies automatically enforced."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">auth</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">AuthClient</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">auth</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="s1">'app_user'</span><span class="p">,</span> <span class="s1">'secure_password'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># RLS policies automatically filter results</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (c:Customer)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN c.name, c.email, c.phone
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Only customers this user is authorized to see</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">]</span>
</span></span></code></pre></div>
<h4 id="configuring-field-level-encryption" class="position-relative d-flex align-items-center group">
<span>Configuring Field-Level Encryption</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configuring-field-level-encryption"
aria-haspopup="dialog"
aria-label="Share link: Configuring Field-Level Encryption">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">base64</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">hashlib</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">hmac</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">tokenize</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Deterministic tokenization for lookup (use KMS/HSM in production)."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">),</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">store_sensitive_data</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Store data with application-layer tokenization."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">token_key</span> <span class="o">=</span> <span class="n">get_master_key</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">tokenized_ssn</span> <span class="o">=</span> <span class="n">tokenize</span><span class="p">(</span><span class="s1">'123-45-6789'</span><span class="p">,</span> <span class="n">token_key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> INSERT (:Customer {
</span></span></span><span class="line"><span class="cl"><span class="s2"> name: $name,
</span></span></span><span class="line"><span class="cl"><span class="s2"> email: $email,
</span></span></span><span class="line"><span class="cl"><span class="s2"> ssn_token: $ssn_token
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'John Doe'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'email'</span><span class="p">:</span> <span class="s1">'
[email protected]'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'ssn_token'</span><span class="p">:</span> <span class="n">tokenized_ssn</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Query tokenized data</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">find_customer_by_ssn</span><span class="p">(</span><span class="n">ssn</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Find customer by SSN using deterministic tokenization."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">token_key</span> <span class="o">=</span> <span class="n">get_master_key</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="n">tokenized_ssn</span> <span class="o">=</span> <span class="n">tokenize</span><span class="p">(</span><span class="n">ssn</span><span class="p">,</span> <span class="n">token_key</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (c:Customer {ssn_token: $ssn_token})
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN c.name, c.email
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'ssn_token'</span><span class="p">:</span> <span class="n">tokenized_ssn</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">row</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">row</span> <span class="k">if</span> <span class="n">row</span> <span class="k">else</span> <span class="kc">None</span>
</span></span></code></pre></div>
<h4 id="audit-logging-and-compliance" class="position-relative d-flex align-items-center group">
<span>Audit Logging and Compliance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="audit-logging-and-compliance"
aria-haspopup="dialog"
aria-label="Share link: Audit Logging and Compliance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">setup_audit_logging</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Configure audit logging for compliance."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Enable audit logging</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> ALTER SYSTEM SET audit_logging = 'all';
</span></span></span><span class="line"><span class="cl"><span class="s2"> ALTER SYSTEM SET audit_log_format = 'json';
</span></span></span><span class="line"><span class="cl"><span class="s2"> ALTER SYSTEM SET audit_retention_days = 90;
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Configure SIEM integration</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> ALTER SYSTEM SET audit_stream_to = 'syslog://siem.example.com:514';
</span></span></span><span class="line"><span class="cl"><span class="s2"> ALTER SYSTEM SET audit_stream_protocol = 'tls';
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Generate compliance report</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">generate_gdpr_access_report</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Generate GDPR data access report for user."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT timestamp, user, query, affected_records
</span></span></span><span class="line"><span class="cl"><span class="s2"> FROM audit_log
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE query LIKE '%User {id: $user_id}%'
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY timestamp DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'user_id'</span><span class="p">:</span> <span class="n">user_id</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">accesses</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">accesses</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'timestamp'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'timestamp'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'accessed_by'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'user'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'query'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'query'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'records'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'affected_records'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'user_id'</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'report_date'</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'total_accesses'</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">accesses</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'access_log'</span><span class="p">:</span> <span class="n">accesses</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span></code></pre></div>
<h4 id="authentication-and-authorization" class="position-relative d-flex align-items-center group">
<span>Authentication and Authorization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="authentication-and-authorization"
aria-haspopup="dialog"
aria-label="Share link: Authentication and Authorization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">authenticate_user</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">password</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Authenticate user with RBAC support."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">auth</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">AuthClient</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">auth</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Check user permissions</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {username: $username})
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN u.roles AS roles, u.permissions AS permissions
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'username'</span><span class="p">:</span> <span class="n">username</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">user_info</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'authenticated'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'roles'</span><span class="p">:</span> <span class="n">user_info</span><span class="p">[</span><span class="s1">'roles'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'permissions'</span><span class="p">:</span> <span class="n">user_info</span><span class="p">[</span><span class="s1">'permissions'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">AuthError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Failed authentication logged to audit log</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span><span class="s1">'authenticated'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">'error'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Role-based access control</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">check_permission</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">resource</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">action</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Check if user has permission for action on resource."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $user_id})-[:HAS_ROLE]->(r:Role)
</span></span></span><span class="line"><span class="cl"><span class="s2"> -[:HAS_PERMISSION]->(p:Permission)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.resource = $resource AND p.action = $action
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN count(p) > 0 AS has_permission
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'user_id'</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'resource'</span><span class="p">:</span> <span class="n">resource</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'action'</span><span class="p">:</span> <span class="n">action</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">row</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">row</span><span class="p">[</span><span class="s1">'has_permission'</span><span class="p">]</span>
</span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="security-configuration" class="position-relative d-flex align-items-center group">
<span>Security Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="security-configuration"
aria-haspopup="dialog"
aria-label="Share link: Security Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Enable TDE</strong>: Always encrypt data at rest in production</li>
<li><strong>Use Strong Passwords</strong>: Enforce password policies (length, complexity)</li>
<li><strong>Rotate Keys</strong>: Regular key rotation (90-180 days)</li>
<li><strong>Principle of Least Privilege</strong>: Grant minimal required permissions</li>
<li><strong>Enable Audit Logging</strong>: Log all access for compliance</li>
</ol>
<h4 id="access-control" class="position-relative d-flex align-items-center group">
<span>Access Control</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="access-control"
aria-haspopup="dialog"
aria-label="Share link: Access Control">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Implement RLS</strong>: Use RLS for multi-tenant applications</li>
<li><strong>Separate Roles</strong>: Create distinct roles for different access levels</li>
<li><strong>Review Permissions</strong>: Regularly audit and review permissions</li>
<li><strong>Revoke Unused Access</strong>: Remove permissions no longer needed</li>
<li><strong>Test Policies</strong>: Validate RLS policies with test queries</li>
</ol>
<h4 id="encryption-management" class="position-relative d-flex align-items-center group">
<span>Encryption Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="encryption-management"
aria-haspopup="dialog"
aria-label="Share link: Encryption Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>KMS Integration</strong>: Use KMS for key management in production</li>
<li><strong>Separate Keys</strong>: Use different keys for different data classifications</li>
<li><strong>Backup Keys</strong>: Securely backup encryption keys</li>
<li><strong>Test Recovery</strong>: Verify encrypted backup restoration</li>
<li><strong>Monitor Key Usage</strong>: Track key usage and rotation</li>
</ol>
<h4 id="compliance" class="position-relative d-flex align-items-center group">
<span>Compliance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="compliance"
aria-haspopup="dialog"
aria-label="Share link: Compliance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Document Policies</strong>: Document all security policies and procedures</li>
<li><strong>Regular Audits</strong>: Conduct security audits quarterly</li>
<li><strong>Compliance Reviews</strong>: Review compliance requirements annually</li>
<li><strong>Incident Response</strong>: Maintain incident response procedures</li>
<li><strong>Training</strong>: Train staff on security best practices</li>
</ol>
<h3 id="related-categories" class="position-relative d-flex align-items-center group">
<span>Related Categories</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-categories"
aria-haspopup="dialog"
aria-label="Share link: Related Categories">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/categories/operations/"
>Operations</a>
- Production deployment and management</li>
<li><a
href="/categories/configuration/"
>Configuration</a>
- Security configuration</li>
<li><a
href="/categories/deployment-and-devops/"
>Deployment</a>
- Secure deployment practices</li>
<li><a
href="/categories/best-practices/"
>Best Practices</a>
- Security guidelines</li>
</ul>
<h3 id="related-tags" class="position-relative d-flex align-items-center group">
<span>Related Tags</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-tags"
aria-haspopup="dialog"
aria-label="Share link: Related Tags">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/tags/tde/"
>TDE</a>
- Transparent Data Encryption</li>
<li><a
href="/tags/fle/"
>FLE</a>
- Field-Level Encryption</li>
<li><a
href="/tags/row-level-security/"
>Row-Level Security</a>
- Fine-grained access control</li>
<li><a
href="/tags/audit-logging/"
>Audit Logging</a>
- Compliance logging</li>
<li><a
href="/tags/authentication/"
>Authentication</a>
- User authentication</li>
<li><a
href="/tags/encryption/"
>Encryption</a>
- Data encryption</li>
<li><a
href="/tags/compliance/"
>Compliance</a>
- Regulatory compliance</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/docs/security/overview/"
>Security Overview</a>
- Complete security architecture</li>
<li><a
href="/tags/row-level-security/"
>Row-Level Security</a>
- Row-Level Security setup</li>
<li><a
href="/docs/security/field-level-encryption/"
>Field-Level Encryption</a>
- TDE and FLE configuration</li>
<li><a
href="/docs/ops/audit-logging/"
>Audit Logging</a>
- Compliance logging</li>
<li><a
href="/tags/compliance/"
>Compliance</a>
- Regulatory compliance guides</li>
</ul>