{"id":14327,"date":"2015-07-28T11:40:35","date_gmt":"2015-07-28T09:40:35","guid":{"rendered":"https:\/\/blog.trifork.com\/?p=14327"},"modified":"2015-07-28T11:40:35","modified_gmt":"2015-07-28T09:40:35","slug":"setting-up-pwm-as-a-password-recovery-tool-for-openldap","status":"publish","type":"post","link":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/","title":{"rendered":"Setting up PWM as a password recovery tool for OpenLDAP"},"content":{"rendered":"<p>A running LDAP implementation without a password recovery service for users can be a real hassle for system administrators, in our case every time when a user forgets his\/her password the only way to reset\/change it was to go to the system administrator let him fix it.<\/p>\n<p>As a solution for this problem we stumbled upon PWM as a password recovery service and in this blogpost will describe the steps you have to take to implement this yourself.<\/p>\n<p>The reasons why we chose PWM as our service of choice are the following:<\/p>\n<ul>\n<li>Open-source and still being actively developed.<\/li>\n<li>It works with multiple LDAP implementations, including OpenLDAP.<\/li>\n<li>Pretty intuitive design for the end-user.<\/li>\n<li>A vast amount of configuration options, of which configuring our own password policy is one option.<\/li>\n<li>Able to recover password by sending and Email\/SMS token or PIN.<\/li>\n<li>Captcha Integration with Google re-Captcha.<\/li>\n<li>Event logs and statistics that are available to administrators.<\/li>\n<\/ul>\n<p>The rest of this post will focus on walking through the installation and initial configuration of PWM with an OpenLDAP system. Most of the things we describe can also be found in the PWM administration guide or from other sources. However, some things (eg. configuration of certain modules in PWM) we didn\u2019t immediately understand and we will describe some tips\/solutions here.<\/p>\n<p><!--more--><\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Lets get started<\/strong><\/p>\n<p><em>Requirements<\/em><\/p>\n<ul>\n<li>An Apache Tomcat instance for running PWM<\/li>\n<li>An OpenLDAP service<\/li>\n<li><em>(optional)<\/em> A (self-signed) SSL\/TLS certificate for securely running PWM<\/li>\n<li>PWM, we used 1.7.1, PWM\u2019s development page can be found at <a href=\"https:\/\/code.google.com\/p\/pwm\/\">https:\/\/code.google.com\/p\/pwm\/<\/a><\/li>\n<\/ul>\n<p>Our installation used Apache Tomcat 7 to serve PWM from a vm running Ubuntu 13.04.<\/p>\n<p>Start by downloading pwm to your machine, in this example we use a dropbox mirror link for a pwm version 1.7.1 zip (also commonly found in other installation tutorials).<\/p>\n<pre>wget https:\/\/www.dropbox.com\/s\/gehtr2jgbr4s8wt\/pwm_v1.7.1.zip<\/pre>\n<pre>unzip pwm_v1.7.1.zip -d pwm_v1.7.1<\/pre>\n<p><em>Stop tomcat, deploy the war and start tomcat again.<\/em><\/p>\n<pre>sudo service tomcat7 stop\n\nsudo cp pwm_v1.7.1\/pwm.war \/var\/lib\/tomcat7\/webapps\n\nsudo service tomcat7 start<\/pre>\n<p>This will deploy pwm to tomcat and you should now be able to reach the app (assuming you run Tomcat under port 8080) via:<\/p>\n<p><strong>http:\/\/&lt;your_IP_address&gt;:8080\/pwm<\/strong><\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Continuing the PWM Installation<\/strong><\/p>\n<p>To make the installation easier, PWM offers a configuration wizard.<\/p>\n<p>The first screen will establish a connection to your LDAP server, this is where you add your server details and proxy or admin account for connecting to your LDAP server.<br \/>\nSince we used a demo VM, we didn\u2019t tick the SSL box in this case, but it\u2019s obviously better to go with the secure connection for connecting to your LDAP server.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14329 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png\" alt=\"Adding server details\" width=\"601\" height=\"488\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png 601w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1-300x244.png 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/a><\/p>\n<p>On the next page, we define the contextless login root. It is possible to enter multiple contexts, however initially pwm will want you to set just one.<\/p>\n<p>This will let PWM know where to look for your ldap users. So if you, for instance, have an organizational unit (ou) called \u2018users\u2019, you might specify \u201cou=users,\u201d followed by your domain component(s).<br \/>\nIf you don\u2019t configure a correct contextless login root, you have to specify the complete ldap entry on login (eg. cn=JohnDoe,ou=users,dc=example,dc=com), which wouldn\u2019t be very user friendly.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14330 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot2.png\" alt=\"Defining the contextless login root\" width=\"602\" height=\"491\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot2.png 602w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot2-300x245.png 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><\/p>\n<p>The administration search filter will give administrator access to its matching entries.<\/p>\n<p>In this example we just enter cn=admin, matching our ldap admin user, so we can continue.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot3.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14331 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot3.png\" alt=\"Adding a test user for PWM\" width=\"602\" height=\"390\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot3.png 602w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot3-300x194.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot3-600x390.png 600w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><\/p>\n<p>It is recommended that you set a test user so that PWM can do health checks periodically. Ideally, this is a user uniquely created for and used by PWM.<\/p>\n<p>You are now able to complete the initial configuration for PWM. After this, you can login as ldap admin and make more changes to the configuration in the pwm configuration editor. The ldap configuration password you entered earlier is needed to access this editor.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Problems occurring upon not applying the PWM schema extensions<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>As we were eager to setup pwm without too much hassle, we only partly followed some tutorials and then tried doing the configuration of pwm on our own. We didn\u2019t read the administration guide or any other source thoroughly yet and thus followed our first error.<\/p>\n<p>As we logged in as ldap admin, with the intention of changing some profile settings to see if everything works correctly, we were prompted to set some recovery responses. PWM supports these type of security questions and answers as a method of recovering your account when you lose or forget your password. Everything went fine up until the point where we hit the save button.<br \/>\nWe were greeted with the following error:<\/p>\n<p><strong>An error occurred during the save of your response questions. Please contact your administrator. {5045 ERROR_WRITING_RESPONSES (response storage only partially successful; attempts=1, successes=0) }<\/strong><\/p>\n<p>As found in the <a href=\"https:\/\/docs.google.com\/document\/d\/1BBHPcOUxZytrqncYFInTaY2PXgW5p1EmzwV8zcpspRg\/edit?pli=1\">PWM Administration guide<\/a>,\u00a0PWM needs a schema extension in the ldap configuration. Another possibility to save responses, configurable in the configuration editor, would be to use a database. However, we decided to just use the schema extension. The administration guide describes the following schema extension:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndn: cn=pwm,cn=schema,cn=config\nobjectClass: olcSchemaConfig\ncn: pwm\nolcAttributeTypes: {0}( 1.3.6.1.4.1.591242.2.2010.04.16.1 NAME 'pwmEventLog' E\n\u00a0QUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )\nolcAttributeTypes: {1}( 1.3.6.1.4.1.591242.2.2010.04.16.2 NAME 'pwmResponseSet\n\u00a0' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )\nolcAttributeTypes: {2}( 1.3.6.1.4.1.591242.2.2010.04.16.3 NAME 'pwmLastPwdUpda\n\u00a0te' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )\nolcAttributeTypes: {3}( 1.3.6.1.4.1.591242.2.2010.04.16.4 NAME 'pwmGUID' SYNTA\n\u00a0X 1.3.6.1.4.1.1466.115.121.1.15 )\nolcObjectClasses: {0}( 1.3.6.1.4.1.591242.1.2010.04.16.1 NAME 'pwmUser' AUXILI\n\u00a0ARY MAY ( pwmLastPwdUpdate $ pwmEventLog $ pwmResponseSet $ pwmGUID ) )\n<\/pre>\n<p>To extend your configuration with this schema, save the above code as an LDIF file and run the <em>ldapadd<\/em> command to add it to your existing schema.<strong><br \/>\n<\/strong><\/p>\n<pre>ldapadd -Y EXTERNAL -H ldapi:\/\/\/ -f scheme_name_goes_here.ldif<\/pre>\n<p>After adding the pwm scheme, the responses setup works and saving password responses for existing users will succeed.<\/p>\n<p>Another situation we found ourselves in later on, when testing with an actual existing environment without adding the pwm schema:<br \/>\nLogins of existing users didn\u2019t work. When we imported an existing production environment in a clean OpenLDAP installation and foolishly forgot to add the schema again, we were unable to login.<br \/>\nThe users from this production environment didn\u2019t have the pwmUser object class and the necessary attributes. After adding the schema again, PWM automatically added the needed attributes when we did a login for one of those users.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Other things worth mentioning<\/strong><br \/>\n<em><strong>Providing a value for your naming attribute in user registration<\/strong><\/em><\/p>\n<p>To automate LDAP user management as much as possible (to save valuable system administrators time), we enabled the \u201cNew User Registration\u201d module. However, PWM has to provide LDAP with a unique distinguished name. If not provided by the registration form, pwm will solve this problem by setting random values. The DN will be formed by the naming attribute (set in <em>Settings &gt; LDAP Directory &gt; (Advanced Settings) &gt; LDAP Naming Attribute<\/em>, eg. cn) and the random value set for that attribute.<\/p>\n<p>Naturally, in a production environment, random values as distinguished names are not that common or an ideal\u00a0situation. We found that in the advanced settings, you can disable these random characters. Go to <em>View &gt; Advanced Settings<\/em> and set <em>Random Username Length <\/em>to zero.<\/p>\n<p>PWM now needs you to specify the value for the naming attribute yourself, if you don\u2019t do this, user registration will not work. To do this, simply make the user specify it\u2019s username. Create a text field in the <em>New User Form<\/em> with name of the naming attribute (eg. \u2018cn\u2019) and then label it \u2018Username\u2019 (or something that suits your implementation). PWM will now use this for the value of the naming attribute.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot4.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14332 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot4.png\" alt=\"Naming attribute\" width=\"601\" height=\"49\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot4.png 601w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot4-300x24.png 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/a><\/p>\n<p>Since this field is required and should be unique in any case, hit <em>Options<\/em> and tick the boxes for required and unique.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot5.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14333 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot5.png\" alt=\"Options for cn\" width=\"366\" height=\"247\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot5.png 366w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot5-300x202.png 300w\" sizes=\"auto, (max-width: 366px) 100vw, 366px\" \/><\/a><\/p>\n<p><em><strong>Automatically write attributes based on form values<\/strong><\/em><\/p>\n<p>To avoid having to ask the user for the same values multiple times, you can use PWM macros. Let\u2019s say you want to ask the user for it\u2019s username to set the naming attribute.<br \/>\nHowever, you also want his\/her display name (attribute \u2018displayName\u2019) to be the same as that same attribute.<br \/>\nSince LDAP doesn\u2019t need the display name attribute to be provided upon creating, you can ask PWM to write this attribute post-creation with the value from the naming attribute.<\/p>\n<p>If we have cn as our naming attribute, we add a <em>New User Action <\/em>in the <em>New User Registration <\/em>module under <em>Modules<\/em>. Let\u2019s say we choose \u201cdisplayName attribute write\u201d as a Name, and \u201cWrite attribute displayName based on cn\u201d as a description.<\/p>\n<p>Pick \u2018ldap\u2019 from the dropdown following the description textfield.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot6.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14334 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot6.png\" alt=\"New user actions\" width=\"601\" height=\"117\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot6.png 601w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot6-300x58.png 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/a><\/p>\n<p>Then, we choose <em>Options<\/em> and fill in the attribute name and value. The value will be the macro, it refers to the cn attribute that is already saved upon creation of the new user entry.<\/p>\n<p><strong><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot7.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14335 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot7.png\" alt=\"Macro's\" width=\"482\" height=\"21\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot7.png 482w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot7-300x13.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/a><\/strong><\/p>\n<p><strong><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot8.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14336 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot8.png\" alt=\"Macro's\" width=\"512\" height=\"140\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot8.png 512w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot8-300x82.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/strong><\/p>\n<p>To view a list of available macros, click <em>View &gt; Macro Help<\/em> in the menu.<\/p>\n<p>Hit OK and we\u2019re good to go, the user will now automatically get a displayName attribute derived from it\u2019s common name (cn) attribute after it\u2019s created.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Use local password policy on new user registration<\/strong><\/em><\/p>\n<p>&nbsp;<\/p>\n<p>By default (or at least in our case), PWM uses a test user password policy template for determining it\u2019s user registration password policy. We found this a little confusing a first but then found out the setting hidden in Advanced Settings. Choose Enable <em>View &gt; Advanced Settings<\/em> when in <em>Modules &gt; New User Registration<\/em> and set <em>New User Password Policy Template<\/em> to a blank field instead of \u2018TESTUSER\u2019.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot9.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14337 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot9.png\" alt=\"User password policy template\" width=\"602\" height=\"61\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot9.png 602w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot9-300x30.png 300w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot9-600x61.png 600w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/a><\/p>\n<p>PWM will now use the local password policy for new user registrations.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Let the admin create users, but through PWM instead of manually<\/strong><\/em><\/p>\n<p>&nbsp;<\/p>\n<p>A thing we would\u2019ve liked to implement was letting visitors sign up via PWM. Their accounts would then only be usable after admin activation. However, we didn\u2019t find an easy way to do this via PWM. This would require having the appointed administrator being notified by email, and ideally with the option to have the admin activate the user\u2019s account with a link.<\/p>\n<p>PWM does however offer a guest registration module, this allows one or more selected ldap account(s) (defined by a search filter on the guest registration module page) to create new accounts. This would allow for new user creation by the admin. This however still requires manually creating user accounts as opposed to just clicking a link for activating a new user account.<\/p>\n<p>So, in the end, we decided against enabling the user registration or guest registration modules. When you do however find it useful to use the guest registration module for the purpose of creating new users, you should keep in mind that normally guests are set to expire.<br \/>\nIt is therefore necessary to provide an expiration date upon guest account creation. You can disable this by setting the expiration date to zero and set the attribute field for the expiration date to blank to overcome this and thus create a guest account as a normal user.<\/p>\n<p><a href=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot10.png\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-14338 aligncenter\" src=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot10.png\" alt=\"User expiration\" width=\"417\" height=\"206\" srcset=\"https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot10.png 417w, https:\/\/trifork.nl\/blog\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot10-300x148.png 300w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Proxy user configuration with the naming attribute<\/strong><\/em><\/p>\n<p>&nbsp;<\/p>\n<p>One thing that slightly confused us was why the proxy user wasn\u2019t handled correctly when configured with the naming attribute. However, the explanation for this, as stated in the help dialog, is: \u201cThis value should be in LDAP distinguished name format, even if your ldap directory accepts other types of values for the bind DN. An example of this format is <em>cn=admin,o=example<\/em> or <em>cn=administrator,cn=users,dc=subdomain,dc=domain,dc=net<\/em>.\u201d<br \/>\nSo the proxy user has to be specified in LDAP distinguished name format.<\/p>\n<p>&nbsp;<\/p>\n<p><em><strong>Disabling the setup of password responses<\/strong><\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Since we were only going to use token verification sent by e-mail, we wanted to disable password responses. This is possible in the Forgotten Password module, but there you can only enable\/disable the setting that requires users to fill in their previously stored responses to continue the password reset process.<br \/>\nUsers still have to set up their responses when they login, and we didn\u2019t immediately see the option to disable that. We later found out that this setting is not found on the Forgotten Password module page, but under <em>Settings &gt; Challenge Policy<\/em> instead.<\/p>\n<p>Niels Masdorp, Lars Leguyt, Daan Roet, Iris Koster and Jesse Alaerds<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A running LDAP implementation without a password recovery service for users can be a real hassle for system administrators, in our case every time when a user forgets his\/her password the only way to reset\/change it was to go to the system administrator let him fix it. As a solution for this problem we stumbled [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[3,124],"tags":[414],"class_list":["post-14327","post","type-post","status-publish","format-standard","hentry","category-business","category-system-administration","tag-rwm"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Setting up PWM as a password recovery tool for OpenLDAP - Trifork 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:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Setting up PWM as a password recovery tool for OpenLDAP - Trifork Blog\" \/>\n<meta property=\"og:description\" content=\"A running LDAP implementation without a password recovery service for users can be a real hassle for system administrators, in our case every time when a user forgets his\/her password the only way to reset\/change it was to go to the system administrator let him fix it. As a solution for this problem we stumbled [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/\" \/>\n<meta property=\"og:site_name\" content=\"Trifork Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-07-28T09:40:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png\" \/>\n<meta name=\"author\" content=\"Niels Masdorp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Niels Masdorp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/\",\"url\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/\",\"name\":\"Setting up PWM as a password recovery tool for OpenLDAP - Trifork Blog\",\"isPartOf\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png\",\"datePublished\":\"2015-07-28T09:40:35+00:00\",\"author\":{\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/3bc746b717006038140fb8a4c1cf9aa4\"},\"breadcrumb\":{\"@id\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#primaryimage\",\"url\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png\",\"contentUrl\":\"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/trifork.nl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Setting up PWM as a password recovery tool for OpenLDAP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/trifork.nl\/blog\/#website\",\"url\":\"https:\/\/trifork.nl\/blog\/\",\"name\":\"Trifork Blog\",\"description\":\"Keep updated on the technical solutions Trifork is working on!\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/trifork.nl\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/3bc746b717006038140fb8a4c1cf9aa4\",\"name\":\"Niels Masdorp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/659d9a96c4490edcd994e302e3f054da?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/659d9a96c4490edcd994e302e3f054da?s=96&d=mm&r=g\",\"caption\":\"Niels Masdorp\"},\"url\":\"https:\/\/trifork.nl\/blog\/author\/nielsm\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Setting up PWM as a password recovery tool for OpenLDAP - Trifork 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:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/","og_locale":"en_US","og_type":"article","og_title":"Setting up PWM as a password recovery tool for OpenLDAP - Trifork Blog","og_description":"A running LDAP implementation without a password recovery service for users can be a real hassle for system administrators, in our case every time when a user forgets his\/her password the only way to reset\/change it was to go to the system administrator let him fix it. As a solution for this problem we stumbled [&hellip;]","og_url":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/","og_site_name":"Trifork Blog","article_published_time":"2015-07-28T09:40:35+00:00","og_image":[{"url":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png","type":"","width":"","height":""}],"author":"Niels Masdorp","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Niels Masdorp","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/","url":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/","name":"Setting up PWM as a password recovery tool for OpenLDAP - Trifork Blog","isPartOf":{"@id":"https:\/\/trifork.nl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#primaryimage"},"image":{"@id":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#primaryimage"},"thumbnailUrl":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png","datePublished":"2015-07-28T09:40:35+00:00","author":{"@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/3bc746b717006038140fb8a4c1cf9aa4"},"breadcrumb":{"@id":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#primaryimage","url":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png","contentUrl":"https:\/\/trifork.nl\/articles\/wp-content\/uploads\/sites\/3\/2015\/07\/screenshot1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/trifork.nl\/blog\/setting-up-pwm-as-a-password-recovery-tool-for-openldap\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/trifork.nl\/blog\/"},{"@type":"ListItem","position":2,"name":"Setting up PWM as a password recovery tool for OpenLDAP"}]},{"@type":"WebSite","@id":"https:\/\/trifork.nl\/blog\/#website","url":"https:\/\/trifork.nl\/blog\/","name":"Trifork Blog","description":"Keep updated on the technical solutions Trifork is working on!","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/trifork.nl\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/3bc746b717006038140fb8a4c1cf9aa4","name":"Niels Masdorp","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/trifork.nl\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/659d9a96c4490edcd994e302e3f054da?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/659d9a96c4490edcd994e302e3f054da?s=96&d=mm&r=g","caption":"Niels Masdorp"},"url":"https:\/\/trifork.nl\/blog\/author\/nielsm\/"}]}},"_links":{"self":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/14327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/comments?post=14327"}],"version-history":[{"count":0,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/posts\/14327\/revisions"}],"wp:attachment":[{"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/media?parent=14327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/categories?post=14327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trifork.nl\/blog\/wp-json\/wp\/v2\/tags?post=14327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}