"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4098],{15680:(e,r,t)=>{t.d(r,{xA:()=>d,yg:()=>y});var n=t(96540);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?o(Object(t),!0).forEach((function(r){a(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var p=n.createContext({}),l=function(e){var r=n.useContext(p),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},d=function(e){var r=l(e.components);return n.createElement(p.Provider,{value:r},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},m=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),c=l(t),m=a,y=c["".concat(p,".").concat(m)]||c[m]||u[m]||o;return t?n.createElement(y,s(s({ref:r},d),{},{components:t})):n.createElement(y,s({ref:r},d))}));function y(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var o=t.length,s=new Array(o);s[0]=m;var i={};for(var p in r)hasOwnProperty.call(r,p)&&(i[p]=r[p]);i.originalType=e,i[c]="string"==typeof e?e:a,s[1]=i;for(var l=2;l<o;l++)s[l]=t[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,t)}m.displayName="MDXCreateElement"},9512:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>d,contentTitle:()=>p,default:()=>y,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=t(58168),a=t(98587),o=(t(96540),t(15680)),s=["components"],i={id:"password-provider",title:"Password providers"},p=void 0,l={unversionedId:"operations/password-provider",id:"operations/password-provider",title:"Password providers",description:"\x3c!--",source:"@site/docs/29.0.0/operations/password-provider.md",sourceDirName:"operations",slug:"/operations/password-provider",permalink:"/docs/29.0.0/operations/password-provider",draft:!1,tags:[],version:"current",frontMatter:{id:"password-provider",title:"Password providers"},sidebar:"docs",previous:{title:"LDAP auth",permalink:"/docs/29.0.0/operations/auth-ldap"},next:{title:"Dynamic Config Providers",permalink:"/docs/29.0.0/operations/dynamic-config-provider"}},d={},c=[],u={toc:c},m="wrapper";function y(e){var r=e.components,t=(0,a.A)(e,s);return(0,o.yg)(m,(0,n.A)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,o.yg)("p",null,"Passwords help secure Apache Druid systems such as the metadata store and the keystore that contains server certificates, and so on."),(0,o.yg)("p",null,"These passwords have corresponding runtime properties associated with them, for example ",(0,o.yg)("inlineCode",{parentName:"p"},"druid.metadata.storage.connector.password")," corresponds to the metadata store password."),(0,o.yg)("p",null,"By default users can directly set the passwords in plaintext for runtime properties. For example, ",(0,o.yg)("inlineCode",{parentName:"p"},"druid.metadata.storage.connector.password=pwd")," sets the password to be used by Druid to connect to the metadata store to ",(0,o.yg)("inlineCode",{parentName:"p"},"pwd"),". Alternatively, users can can set passwords as environment variables."),(0,o.yg)("p",null,"Environment variable passwords allow users to avoid exposing passwords in the ",(0,o.yg)("inlineCode",{parentName:"p"},"runtime.properties")," file. "),(0,o.yg)("p",null,"You can set an environment variable password as in the following example: "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'druid.metadata.storage.connector.password={ "type": "environment", "variable": "METADATA_STORAGE_PASSWORD" }\n')),(0,o.yg)("p",null,"The values are described below."),(0,o.yg)("table",null,(0,o.yg)("thead",{parentName:"table"},(0,o.yg)("tr",{parentName:"thead"},(0,o.yg)("th",{parentName:"tr",align:null},"Field"),(0,o.yg)("th",{parentName:"tr",align:null},"Type"),(0,o.yg)("th",{parentName:"tr",align:null},"Description"),(0,o.yg)("th",{parentName:"tr",align:null},"Required"))),(0,o.yg)("tbody",{parentName:"table"},(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:null},(0,o.yg)("inlineCode",{parentName:"td"},"type")),(0,o.yg)("td",{parentName:"tr",align:null},"String"),(0,o.yg)("td",{parentName:"tr",align:null},"password provider type"),(0,o.yg)("td",{parentName:"tr",align:null},"Yes: ",(0,o.yg)("inlineCode",{parentName:"td"},"environment"))),(0,o.yg)("tr",{parentName:"tbody"},(0,o.yg)("td",{parentName:"tr",align:null},(0,o.yg)("inlineCode",{parentName:"td"},"variable")),(0,o.yg)("td",{parentName:"tr",align:null},"String"),(0,o.yg)("td",{parentName:"tr",align:null},"environment variable to read password from"),(0,o.yg)("td",{parentName:"tr",align:null},"Yes")))),(0,o.yg)("p",null,"Another option that provides even greater control is to securely fetch passwords at runtime using a custom extension of the ",(0,o.yg)("inlineCode",{parentName:"p"},"PasswordProvider")," interface that is registered at Druid process startup."),(0,o.yg)("p",null,"For more information, see ",(0,o.yg)("a",{parentName:"p",href:"/docs/29.0.0/development/modules#adding-a-new-password-provider-implementation"},"Adding a new Password Provider implementation"),"."),(0,o.yg)("p",null,"To use this implementation, simply set the relevant password runtime property similarly to how was shown for the environment variable password: "),(0,o.yg)("pre",null,(0,o.yg)("code",{parentName:"pre",className:"language-json"},'druid.metadata.storage.connector.password={ "type": "<registered_password_provider_name>", "<jackson_property>": "<value>", ... }\n')))}y.isMDXComponent=!0}}]);