<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Knowledge Base (Posts about expiration)</title><link>https://bgstack15.ddns.net/blog/</link><description></description><atom:link href="https://bgstack15.ddns.net/blog/categories/expiration.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2023 &lt;a href="mailto:bgstack15@gmail.com"&gt;bgstack15&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-SA"
style="border-width:0; margin-bottom:12px;"
src="https://bgstack15.ddns.net/.images/l_by-sa_4.0_88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Mon, 13 Feb 2023 14:30:29 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Powershell find user password expiration date</title><link>https://bgstack15.ddns.net/blog/posts/2022/09/26/powershell-find-user-password-expiration-date/</link><dc:creator>bgstack15</dc:creator><description>&lt;h6&gt;edited 2023-02-09&lt;/h6&gt;
&lt;p&gt;This started as a direct duplicate of &lt;a href="https://powershell-guru.com/powershell-tip-38-find-the-user-password-expiration-date/"&gt;https://powershell-guru.com/powershell-tip-38-find-the-user-password-expiration-date/&lt;/a&gt; but I improved it.&lt;/p&gt;
&lt;p&gt;For a nice powershell function that shows a human-readable date for when the password expires on an account:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ADUserPasswordExpiration&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Param&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;$&lt;span class="n"&gt;Identity&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;$&lt;span class="n"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)][&lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;$&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"ipa.example.com"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;$&lt;span class="n"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)][&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Automation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PSCredential&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;$&lt;span class="n"&gt;Credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Automation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PSCredential&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;$&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="n"&gt;Identity&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Properties&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;'msDS-UserPasswordExpiryTimeComputed'&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;$&lt;span class="n"&gt;Credential&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserName&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;$&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Credential"&lt;/span&gt;&lt;span class="p"&gt;]=&lt;/span&gt;$&lt;span class="n"&gt;Credential&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;FromFileTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;$&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="n"&gt;msDS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;UserPasswordExpiryTimeComputed&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;My value-add includes the optioanl &lt;code&gt;-Server&lt;/code&gt; and &lt;code&gt;-Credential&lt;/code&gt; parameters.&lt;/p&gt;
&lt;h4&gt;Also from that source&lt;/h4&gt;
&lt;p&gt;To list all the Active Directory constructed attributes:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;ADObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;SearchBase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;ADRootDSE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;SchemaNamingContext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;LDAPFilter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"(&amp;amp;(systemFlags:1.2.840.113556.1.4.803:=4)(ObjectClass=attributeSchema))"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>expiration</category><category>password</category><category>powershell</category><category>user</category><guid>https://bgstack15.ddns.net/blog/posts/2022/09/26/powershell-find-user-password-expiration-date/</guid><pubDate>Mon, 26 Sep 2022 12:46:19 GMT</pubDate></item><item><title>Monitor freeipa certificate expirations</title><link>https://bgstack15.ddns.net/blog/posts/2021/11/02/monitor-freeipa-certificate-expirations/</link><dc:creator>bgstack15</dc:creator><description>&lt;h2&gt;Project freeipa-cert-alert&lt;/h2&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;Freeipa-cert-alert is a small project that lists the certificates from an IPA server that will expire soon. The idea is to pass the output to a mail or logging utility.&lt;/p&gt;
&lt;p&gt;I wanted to manipulate the objects coming from freeipa more directly than parsing the textual output (which is not a terrible way to do it), because I know that FreeIPA is a Python project. Come to find out, the &lt;code&gt;python3-freeipa&lt;/code&gt; package is not a core part of freeipa, which uses &lt;code&gt;python-ipa*&lt;/code&gt; package names. But python3-freeipa provides the suitable commands that return useful objects we can iterate through.&lt;/p&gt;
&lt;p&gt;Even the &lt;code&gt;cert_find()&lt;/code&gt; implementation lets you pick start and stop times for the validity period, which is most of the work involved.&lt;/p&gt;
&lt;p&gt;I also devised some dirty tricks to columnize the output.&lt;/p&gt;
&lt;h3&gt;Using freeipa-cert-alert&lt;/h3&gt;
&lt;p&gt;You configure it with environment variables at runtime, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FREEIPA_SERVER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FREEIPA_USERNAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FREEIPA_PASSWORD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DAYS&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For some reason, domain name does not suffice as the server name. You must pick a server name. This is discoverable in a properly-functioning Kerberos domain with:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dig +short -t srv _ldap._tcp.yourdomain.com | awk '{print $4}'
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Example&lt;/h4&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nv"&gt;DAYS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;180&lt;/span&gt; ./freeipa-cert-alert.py
Certificates expiring within &lt;span class="m"&gt;180&lt;/span&gt; days from &lt;span class="m"&gt;2021&lt;/span&gt;-10-27
Not valid before               Not valid after                Subject
Thu Jan &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;:18:28 &lt;span class="m"&gt;2020&lt;/span&gt; UTC   Sun Jan &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;:18:28 &lt;span class="m"&gt;2022&lt;/span&gt; UTC   &lt;span class="nv"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;d2-02a.ipa.example.com,O&lt;span class="o"&gt;=&lt;/span&gt;IPA.EXAMPLE.COM
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Upstream&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://gitlab.com/bgstack15/freeipa-cert-alert"&gt;My gitlab repo&lt;/a&gt; is the source.&lt;/p&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;Examine the output of &lt;code&gt;ipa cert-find&lt;/code&gt; manually. Otherwise, I found no examples that do what I do here.&lt;/p&gt;</description><category>certificates</category><category>expiration</category><category>freeipa</category><category>python</category><guid>https://bgstack15.ddns.net/blog/posts/2021/11/02/monitor-freeipa-certificate-expirations/</guid><pubDate>Tue, 02 Nov 2021 12:52:51 GMT</pubDate></item></channel></rss>