{"id":15425,"date":"2020-12-26T15:33:44","date_gmt":"2020-12-26T14:33:44","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/"},"modified":"2020-12-26T15:33:44","modified_gmt":"2020-12-26T14:33:44","slug":"cluster-level-encryption-for-postgresql-14","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/","title":{"rendered":"Cluster level encryption for PostgreSQL 14"},"content":{"rendered":"<p>The discussions how and why TDE (Transparent data encryption) should be implemented in PostgreSQL goes back several years. You can have a look at these two more recent threads to get an idea on how much discussion happened around that feature:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.postgresql.org\/message-id\/flat\/031401d3f41d%245c70ed90%241552c8b0%24%40lab.ntt.co.jp\" target=\"_blank\" rel=\"noopener noreferrer\">[Proposal] Table-level Transparent Data Encryption (TDE) and Key Management Service (KMS)<\/a><\/li>\n<li><a href=\"https:\/\/www.postgresql.org\/message-id\/flat\/CA%2Bfd4k46HHDiPE_39F1C%3DB%2BF-1pbinFPsW-GyPzvxSz%2BpZx1Qw%40mail.gmail.com#df0574953644e55487cdb655e6214af3\" target=\"_blank\" rel=\"noopener noreferrer\">Re: Internal key management system<\/a><\/li>\n<\/ul>\n<p>Finally an essentials part for that infrastructure <a href=\"https:\/\/git.postgresql.org\/gitweb\/?p=postgresql.git;a=commitdiff;h=978f869b992f9fca343e99d6fdb71073c76e869a\" target=\"_blank\" rel=\"noopener noreferrer\">was committed<\/a> and I am sure, many people have waited for that to appear in plain community PostgreSQL. Lets have a quick look how it works and if it easy to play with.<\/p>\n<p><!--more--><\/p>\n<p>To get an encrypted cluster you need to specify that when you initialize the cluster with initdb. One additional requirement is, that PostgreSQL was compiled with &#8220;&#8211;with-openssl&#8221;:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] pg_config | grep openssl\nCONFIGURE =  '--prefix=\/u01\/app\/postgres\/product\/DEV\/db_1\/' '--exec-prefix=\/u01\/app\/postgres\/product\/DEV\/db_1\/' '--bindir=\/u01\/app\/postgres\/product\/DEV\/db_1\/\/bin' '--libdir=\/u01\/app\/postgres\/product\/DEV\/db_1\/\/lib' '--sysconfdir=\/u01\/app\/postgres\/product\/DEV\/db_1\/\/etc' '--includedir=\/u01\/app\/postgres\/product\/DEV\/db_1\/\/include' '--datarootdir=\/u01\/app\/postgres\/product\/DEV\/db_1\/\/share' '--datadir=\/u01\/app\/postgres\/product\/DEV\/db_1\/\/share' '--with-pgport=5432' '--with-perl' '--with-python' '--with-openssl' '--with-pam' '--with-ldap' '--with-libxml' '--with-libxslt' '--with-segsize=2' '--with-blocksize=8' '--with-llvm' 'LLVM_CONFIG=\/usr\/bin\/llvm-config-7' '--with-systemd'\n<\/pre>\n<p>If that is given you can initialize a new cluster and tell initdb how to get the encryption key:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] initdb --help | grep cluster-key-command\n  -c  --cluster-key-command=COMMAND\n<\/pre>\n<p>If this key is provided, two internal keys are generated, one for the table and index files (and any temporary objects) and one for the WAL files:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] initdb --pgdata=\/var\/tmp\/pgenc --cluster-key-command=\/home\/postgres\/get_key.sh\nThe files belonging to this database system will be owned by user \"postgres\".\nThis user must also own the server process.\n\nThe database cluster will be initialized with locale \"en_US.UTF-8\".\nThe default database encoding has accordingly been set to \"UTF8\".\nThe default text search configuration will be set to \"english\".\n\nData page checksums are disabled.\nCluster file encryption is enabled.\n\ncreating directory \/var\/tmp\/pgenc ... ok\ncreating subdirectories ... ok\nselecting dynamic shared memory implementation ... posix\nselecting default max_connections ... 100\nselecting default shared_buffers ... 128MB\nselecting default time zone ... Europe\/Zurich\ncreating configuration files ... ok\nrunning bootstrap script ... ok\nperforming post-bootstrap initialization ... ok\nsyncing data to disk ... ok\n\ninitdb: warning: enabling \"trust\" authentication for local connections\nYou can change this by editing pg_hba.conf or using the option -A, or\n--auth-local and --auth-host, the next time you run initdb.\n\nSuccess. You can now start the database server using:\n\n    pg_ctl -D \/var\/tmp\/pgenc -l logfile start\n<\/pre>\n<p>The command to get the key in this example is quite trivial:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] cat \/home\/postgres\/get_key.sh\necho \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n<\/pre>\n<p>In a real setup the key should of course come from an external key store. Lets try to start the cluster:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] export PGPORT=8888\npostgres@debian10pg:\/home\/postgres\/ [pgdev] pg_ctl -D \/var\/tmp\/pgenc\/ start\nwaiting for server to start....2020-12-26 16:11:12.220 CET [7106] LOG:  starting PostgreSQL 14devel on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit\n2020-12-26 16:11:12.221 CET [7106] LOG:  listening on IPv6 address \"::1\", port 8888\n2020-12-26 16:11:12.221 CET [7106] LOG:  listening on IPv4 address \"127.0.0.1\", port 8888\n2020-12-26 16:11:12.234 CET [7106] LOG:  listening on Unix socket \"\/tmp\/.s.PGSQL.8888\"\n2020-12-26 16:11:12.250 CET [7109] LOG:  database system was shut down at 2020-12-26 16:08:34 CET\n2020-12-26 16:11:12.274 CET [7106] LOG:  database system is ready to accept connections\n done\nserver started\n<\/pre>\n<p>Why does that work? We did not provide the key at startup time so PostgreSQL somehow must know how to get the key. Actually there is a new parameter that automatically gets the command we specified when we initialized the cluster:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] grep cluster_key \/var\/tmp\/pgenc\/postgresql.conf \ncluster_key_command = '\/home\/postgres\/get_key.sh'\n<\/pre>\n<p>If we remove that and start again it will not work:<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1; highlight: [18]\">\npostgres@debian10pg:\/home\/postgres\/ [pgdev] psql -c \"alter system set cluster_key_command=''\" postgres\nALTER SYSTEM\npostgres@debian10pg:\/home\/postgres\/ [pgdev] grep cluster_key \/var\/tmp\/pgenc\/postgresql.auto.conf \ncluster_key_command = ''\npostgres@debian10pg:\/home\/postgres\/ [pgdev] pg_ctl -D \/var\/tmp\/pgenc\/ stop\n2020-12-26 16:15:29.457 CET [7106] LOG:  received fast shutdown request\nwaiting for server to shut down....2020-12-26 16:15:29.467 CET [7106] LOG:  aborting any active transactions\n2020-12-26 16:15:29.469 CET [7106] LOG:  background worker \"logical replication launcher\" (PID 7115) exited with exit code 1\n2020-12-26 16:15:29.473 CET [7110] LOG:  shutting down\n2020-12-26 16:15:29.534 CET [7106] LOG:  database system is shut down\n done\nserver stopped\n16:15:29 postgres@debian10pg:\/home\/postgres\/ [pgdev] pg_ctl -D \/var\/tmp\/pgenc\/ start\nwaiting for server to start....2020-12-26 16:15:31.762 CET [7197] LOG:  starting PostgreSQL 14devel on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit\n2020-12-26 16:15:31.763 CET [7197] LOG:  listening on IPv6 address \"::1\", port 8888\n2020-12-26 16:15:31.763 CET [7197] LOG:  listening on IPv4 address \"127.0.0.1\", port 8888\n2020-12-26 16:15:31.778 CET [7197] LOG:  listening on Unix socket \"\/tmp\/.s.PGSQL.8888\"\n2020-12-26 16:15:31.786 CET [7197] FATAL:  cluster key must be 64 hexadecimal characters\n2020-12-26 16:15:31.787 CET [7197] LOG:  database system is shut down\n stopped waiting\npg_ctl: could not start server\nExamine the log output.\n<\/pre>\n<p>The two keys that have been generated when the cluster was initialized can be found in $PGDATA:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/var\/tmp\/pgenc\/ [pgdev] ls -la pg_cryptokeys\/live\/\ntotal 16\ndrwx------ 2 postgres postgres 4096 Dec 26 16:08 .\ndrwx------ 3 postgres postgres 4096 Dec 26 16:08 ..\n-rw------- 1 postgres postgres   72 Dec 26 16:08 0\n-rw------- 1 postgres postgres   72 Dec 26 16:08 1\n<\/pre>\n<p>The reason for two separate keys is, that a primary and a replica cluster can have a different key for the table, index and all other files generated during database operations but still can have the same key for the WAL files. Btw: pg_controldata will also tell you if a cluster is encrypted:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">\npostgres@debian10pg:\/var\/tmp\/pgenc\/base\/12833\/ [pgdev] pg_controldata -D \/var\/tmp\/pgenc\/ | grep encr\nFile encryption key length:           128\n<\/pre>\n<p>That really is a nice and much appreciated feature. Currently only the whole cluster can be encrypted, but I am sure that is sufficient for most of the use cases. Lets hope that it will not get reverted for any reason.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The discussions how and why TDE (Transparent data encryption) should be implemented in PostgreSQL goes back several years. You can have a look at these two more recent threads to get an idea on how much discussion happened around that feature: [Proposal] Table-level Transparent Data Encryption (TDE) and Key Management Service (KMS) Re: Internal key [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[77],"type_dbi":[],"class_list":["post-15425","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.8 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Cluster level encryption for PostgreSQL 14 - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cluster level encryption for PostgreSQL 14\" \/>\n<meta property=\"og:description\" content=\"The discussions how and why TDE (Transparent data encryption) should be implemented in PostgreSQL goes back several years. You can have a look at these two more recent threads to get an idea on how much discussion happened around that feature: [Proposal] Table-level Transparent Data Encryption (TDE) and Key Management Service (KMS) Re: Internal key [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-26T14:33:44+00:00\" \/>\n<meta name=\"author\" content=\"Open source Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Open source Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/\"},\"author\":{\"name\":\"Open source Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\"},\"headline\":\"Cluster level encryption for PostgreSQL 14\",\"datePublished\":\"2020-12-26T14:33:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/\"},\"wordCount\":372,\"commentCount\":1,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/\",\"name\":\"Cluster level encryption for PostgreSQL 14 - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2020-12-26T14:33:44+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/cluster-level-encryption-for-postgresql-14\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cluster level encryption for PostgreSQL 14\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/4bae5e5dd8c7d48edbd948772b49b202\",\"name\":\"Open source Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g\",\"caption\":\"Open source Team\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/open-source-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cluster level encryption for PostgreSQL 14 - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/","og_locale":"en_US","og_type":"article","og_title":"Cluster level encryption for PostgreSQL 14","og_description":"The discussions how and why TDE (Transparent data encryption) should be implemented in PostgreSQL goes back several years. You can have a look at these two more recent threads to get an idea on how much discussion happened around that feature: [Proposal] Table-level Transparent Data Encryption (TDE) and Key Management Service (KMS) Re: Internal key [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/","og_site_name":"dbi Blog","article_published_time":"2020-12-26T14:33:44+00:00","author":"Open source Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Open source Team","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/"},"author":{"name":"Open source Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202"},"headline":"Cluster level encryption for PostgreSQL 14","datePublished":"2020-12-26T14:33:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/"},"wordCount":372,"commentCount":1,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/","url":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/","name":"Cluster level encryption for PostgreSQL 14 - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2020-12-26T14:33:44+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/cluster-level-encryption-for-postgresql-14\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Cluster level encryption for PostgreSQL 14"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/4bae5e5dd8c7d48edbd948772b49b202","name":"Open source Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/eb4fb12e386e8c41fdef0733e8114594cf2653e4f55e9fa2161442b8eaf3f657?s=96&d=mm&r=g","caption":"Open source Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/open-source-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/15425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=15425"}],"version-history":[{"count":0,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/15425\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=15425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=15425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=15425"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=15425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}