{"id":161,"date":"2020-08-31T22:17:18","date_gmt":"2020-08-31T22:17:18","guid":{"rendered":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/?p=161"},"modified":"2024-07-05T11:40:39","modified_gmt":"2024-07-05T10:40:39","slug":"ibm-mq-basics-security-part-2-user-authentication","status":"publish","type":"post","link":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/2020\/08\/31\/ibm-mq-basics-security-part-2-user-authentication\/","title":{"rendered":"<span class=\"caps\">IBM<\/span> <span class=\"caps\">MQ<\/span> basics: security \u2014 part 2: user authentication"},"content":{"rendered":"<p>User authen\u00adti\u00adca\u00adtion is anoth\u00ader aspect of secu\u00adri\u00adty that is often over\u00adlooked and many think it only applies to human&nbsp;users.<\/p>\n<p>Quite the con\u00adtrary! User authen\u00adti\u00adca\u00adtion, albeit with a few twists, is an essen\u00adtial aspect for secur\u00ading appli\u00adca\u00adtions\u2019 access to resources.<\/p>\n<p><span class=\"caps\">IBM<\/span> <span class=\"caps\">MQ<\/span> can be con\u00adfig\u00adured to force users and appli\u00adca\u00adtions to sup\u00adply a user\u00adname and a pass\u00adword before being allowed to access any of its objects.<\/p>\n<p><!--more--><\/p>\n<p>Before <span class=\"caps\">MQ<\/span> 8.0, secu\u00adri\u00adty authen\u00adti\u00adca\u00adtion was imple\u00adment\u00aded using secu\u00adri\u00adty exit pro\u00adgrams. These are spe\u00adcial pro\u00adgrams you can write with a spe\u00adcif\u00adic set of input para\u00adme\u00adters, and spe\u00adcif\u00adic out\u00adput values.<\/p>\n<p style=\"text-align: left;\">But 8.0 brought us the abil\u00adi\u00adty to ver\u00adi\u00adfy a username\/password pair against a user repos\u00adi\u00adto\u00adry, either man\u00adaged by the oper\u00adat\u00ading sys\u00adtem or an exter\u00adnal <span class=\"caps\">LDAP<\/span> directory.<\/p>\n<p><span class=\"caps\">NOTE<\/span>: <span class=\"caps\">IBM<\/span> <span class=\"caps\">MQ<\/span> ver\u00adsions 8.0 and lat\u00ader have two authen\u00adti\u00adca\u00adtion meth\u00adods: an old one, called the com\u00adpat\u00adi\u00adbil\u00adi\u00adty mode and a new one, called <span class=\"caps\">MQCSP<\/span> authen\u00adti\u00adca\u00adtion. In com\u00adpat\u00adi\u00adbil\u00adi\u00adty mode, pass\u00adwords and user\u00adnames are lim\u00adit\u00aded (and trun\u00adcat\u00aded, if longer) to 12 char\u00adac\u00adters. In order to user user\u00adnames or pass\u00adwords longer than 12 char\u00adac\u00adters, the client appli\u00adca\u00adtion has to use <span class=\"caps\">MQCSP<\/span> authen\u00adti\u00adca\u00adtion (dis\u00adable the Enable Com\u00adpat\u00adi\u00adbil\u00adi\u00adty mode check\u00adbox in the <span class=\"caps\">MQ<\/span> Explor\u00ader Userid con\u00adfig\u00adu\u00adra\u00adtion window).<\/p>\n<h1>Operating system authentication<\/h1>\n<p>This authen\u00adti\u00adca\u00adtion method relies on the under\u00adly\u00ading oper\u00adat\u00ading sys\u00adtem\u2019s ser\u00advices to val\u00adi\u00addate users and pass\u00adwords. To use it, you just have to cre\u00adate an <span class=\"caps\">AUTHINFO<\/span> object of type <span class=\"caps\">IDPWOS<\/span>. The <span class=\"caps\">MQSC<\/span> com\u00admand is as follows:<\/p>\n<p class=\"code-example\"><span class=\"caps\">DEFINE<\/span> <span class=\"caps\">AUTHINFO<\/span>(<span class=\"caps\">USE<\/span>.<span class=\"caps\">OS<\/span>) <span class=\"caps\">AUTHTYPE<\/span>(<span class=\"caps\">IDPWOS<\/span>) <span class=\"caps\">CHCKLOCL<\/span>(<span class=\"caps\">OPTIONAL<\/span>) <span class=\"caps\">CHCKCLNT<\/span> (<span class=\"caps\">REQDADM<\/span>) <span class=\"caps\">REPLACE<\/span><\/p>\n<p>The <span class=\"caps\">CHCKLOCL<\/span> and <span class=\"caps\">CHCKCLNT<\/span> apply to local and client (remote) con\u00adnec\u00adtions, respec\u00adtive\u00adly. Both can take the fol\u00adlow\u00ading values:<\/p>\n<ul>\n<li><span class=\"caps\">NONE<\/span>: No authen\u00adti\u00adca\u00adtion will be enforced or ver\u00adi\u00adfied. If any con\u00adnec\u00adtion attempt has authen\u00adti\u00adca\u00adtion infor\u00adma\u00adtion, it will be ignored.<\/li>\n<li><span class=\"caps\">OPTIONAL<\/span>: No authen\u00adti\u00adca\u00adtion will be enforced. How\u00adev\u00ader, if a con\u00adnec\u00adtion attempt has authen\u00adti\u00adca\u00adtion infor\u00adma\u00adtion, the user must be valid, and if it is suc\u00adcess\u00adful, the spec\u00adi\u00adfied user has to have the cor\u00adrect per\u00admis\u00adsions to con\u00adnect to the queue manager.<\/li>\n<li><span class=\"caps\">REQDADM<\/span>: Authen\u00adti\u00adca\u00adtion will be enforced if the user belongs to the <span class=\"caps\">MQ<\/span> admin\u00adis\u00adtra\u00adtion oper\u00adat\u00ading sys\u00adtem group (mqm in Win\u00addows, Lin\u00adux or <span class=\"caps\">UNIX<\/span>, <span class=\"caps\">OR<\/span> Admin\u00adis\u00adtra\u00adtors in Windows).<\/li>\n<li><span class=\"caps\">REQUIRED<\/span>: Authen\u00adti\u00adca\u00adtion will be enforced all the&nbsp;time.<\/li>\n<\/ul>\n<p>After defin\u00ading the <span class=\"caps\">AUTHINFO<\/span> for this type of authen\u00adti\u00adca\u00adtion, con\u00adfig\u00adure the queue man\u00adag\u00ader to use&nbsp;it:<\/p>\n<p class=\"code-example\"><span class=\"caps\">ALTER<\/span> <span class=\"caps\">QMGR<\/span> <span class=\"caps\">CONNAUTH<\/span>(<span class=\"caps\">USE<\/span>.<span class=\"caps\">OS<\/span>)<\/p>\n<p>To use it, either restart the queue man\u00adag\u00ader or issue the command:<\/p>\n<p class=\"code-example\"><span class=\"caps\">REFRESH<\/span> <span class=\"caps\">SECURITY<\/span> <span class=\"caps\">TYPE<\/span>(<span class=\"caps\">CONNAUTH<\/span>)<\/p>\n<h1><span class=\"caps\">LDAP<\/span> Authentication<\/h1>\n<p>In the fol\u00adlow\u00ading exam\u00adple, I\u2019ll demon\u00adstrate con\u00adfig\u00adur\u00ading <span class=\"caps\">LDAP<\/span> authen\u00adti\u00adca\u00adtion against Microsoft\u00ad\u2019s Active Direc\u00adto\u00adry. It\u2019s a bit more com\u00adpli\u00adcat\u00aded than oth\u00ader <span class=\"caps\">LDAP<\/span> servers, but the com\u00admands can be eas\u00adi\u00adly adapt\u00aded to others.<\/p>\n<p>Note: <span class=\"caps\">LDAP<\/span> authen\u00adti\u00adca\u00adtion is only sup\u00adport\u00aded from <span class=\"caps\">MQ<\/span> 8.0 onwards. Regard\u00adless, if you have <span class=\"caps\">MQ<\/span> 8.0 and want to use Active Direc\u00adto\u00adry, you have to raise the com\u00admand lev\u00adel of <span class=\"caps\">MQ<\/span> to 802. To do this, just fol\u00adlow the fol\u00adlow\u00ading&nbsp;steps:<\/p>\n<ol>\n<li>Stop the queue manager:<br>\n<span style=\"font-family: andale mono, monospace;\">end\u00admqm&nbsp;<span class=\"caps\">MQ01<\/span><\/span><\/li>\n<li>Raise the <span class=\"caps\">CMDLEVEL<\/span> of the queue manager<br>\n<span style=\"font-family: andale mono, monospace;\">str\u00admqm \u2011e <span class=\"caps\">CMDLEVEL<\/span>=802 <span class=\"caps\">MQ01<\/span><\/span><\/li>\n<li>Start the queue manager<br>\n<span style=\"font-family: andale mono, monospace;\">str\u00admqm&nbsp;<span class=\"caps\">MQ01<\/span><\/span><\/li>\n<\/ol>\n<p>So, just define an <span class=\"caps\">AUTHINFO<\/span> object of type <span class=\"caps\">IDPWLDAP<\/span>.<\/p>\n<p class=\"code-example\"><span class=\"caps\">DEFINE<\/span> <span class=\"caps\">AUTHINFO<\/span>(<span class=\"caps\">USE<\/span>.<span class=\"caps\">LDAP<\/span>) <span class=\"caps\">AUTHTYPE<\/span>(<span class=\"caps\">IDPWLDAP<\/span>) <span class=\"caps\">DESCR<\/span>(\u2018<span class=\"caps\">LDAP<\/span> Authen\u00adti\u00adca\u00adtion\u2019) <span class=\"caps\">CHCKCLNT<\/span>(<span class=\"caps\">REQUIRED<\/span>) <span class=\"caps\">CHCKLOCL<\/span>(<span class=\"caps\">NONE<\/span>) <span class=\"caps\">ADOPTCTX<\/span>(<span class=\"caps\">YES<\/span>) <span class=\"caps\">FAILDLAY<\/span>(10) <span class=\"caps\">LDAPUSER<\/span>(\u2018tests.mq\u2019) <span class=\"caps\">LDAPPWD<\/span>(\u2018Tm@1234\u2019) <span class=\"caps\">CONNAME<\/span>(\u2018adserver\u2019) <span class=\"caps\">SECCOMM<\/span>(<span class=\"caps\">YES<\/span>) <span class=\"caps\">SHORTUSR<\/span>(\u2018sn\u2019) <span class=\"caps\">CLASSUSR<\/span>(\u2018user\u2019) <span class=\"caps\">BASEDNU<\/span>(\u2018ou=users,dc=addomain, dc=local\u2019) <span class=\"caps\">USRFIELD<\/span>(\u2018sAMAccountName\u2019) <span class=\"caps\">GRPFIELD<\/span>(\u2018cn\u2019) <span class=\"caps\">CLASSGRP<\/span>(\u2018group\u2019) <span class=\"caps\">BASEDNG<\/span>(\u2018ou=groups,ou=users,dc=addomain, dc=local\u2019) <span class=\"caps\">FINDGRP<\/span>(\u2018member\u2019) <span class=\"caps\">AUTHORMD<\/span>(<span class=\"caps\">SEARCHGRP<\/span>) <span class=\"caps\">REPLACE<\/span><\/p>\n<p>As you can see, there are lots more options in the <span class=\"caps\">IDPWLDAP<\/span> authen\u00adti\u00adca\u00adtion type. Lets go through all these parameters:<\/p>\n<ul>\n<li><span class=\"caps\">ADOPTCTX<\/span>: Whether to use the pre\u00adsent\u00aded cre\u00adden\u00adtials as the con\u00adtext for this appli\u00adca\u00adtion. This means that they are used for autho\u00adriza\u00adtion checks, shown on admin\u00adis\u00adtra\u00adtive dis\u00adplays, and appear in messages.&nbsp;<ul>\n<li><span class=\"caps\">YES<\/span><br>\nThe user <span class=\"caps\">ID<\/span> pre\u00adsent\u00aded in the <span class=\"caps\">MQCSP<\/span> struc\u00adture, which has been suc\u00adcess\u00adful\u00adly val\u00adi\u00addat\u00aded by pass\u00adword, is adopt\u00aded as the con\u00adtext to use for this appli\u00adca\u00adtion. There\u00adfore, this user <span class=\"caps\">ID<\/span> will be the cre\u00adden\u00adtials checked for autho\u00adriza\u00adtion to use <span class=\"caps\">IBM<\/span> <span class=\"caps\">MQ<\/span> resources. If the user <span class=\"caps\">ID<\/span> pre\u00adsent\u00aded is an <span class=\"caps\">LDAP<\/span> user <span class=\"caps\">ID<\/span>, and autho\u00adriza\u00adtion checks are done using oper\u00adat\u00ading sys\u00adtem user IDs, the <span class=\"caps\">SHORTUSR<\/span> asso\u00adci\u00adat\u00aded with the user entry in <span class=\"caps\">LDAP<\/span> will be adopt\u00aded as the cre\u00adden\u00adtials for autho\u00adriza\u00adtion checks to be done against.<\/li>\n<li><span class=\"caps\">NO<\/span><br>\nAuthen\u00adti\u00adca\u00adtion will be per\u00adformed on the user <span class=\"caps\">ID<\/span> and pass\u00adword pre\u00adsent\u00aded in the <span class=\"caps\">MQCSP<\/span> struc\u00adture, but then the cre\u00adden\u00adtials will not be adopt\u00aded for fur\u00adther use. Autho\u00adriza\u00adtion will be per\u00adformed using the user <span class=\"caps\">ID<\/span> the appli\u00adca\u00adtion is run\u00adning&nbsp;under.<\/li>\n<\/ul>\n<\/li>\n<li><span class=\"caps\">FAILDLAY<\/span>: spec\u00adi\u00adfy the delay used by <span class=\"caps\">MQ<\/span> to noti\u00adfy the appli\u00adca\u00adtion of any failed authen\u00adti\u00adca\u00adtion. This is to pre\u00advent the appli\u00adca\u00adtion from ham\u00admer\u00ading <span class=\"caps\">MQ<\/span> with failed con\u00adnec\u00adtion attempts.<\/li>\n<li><span class=\"caps\">LDAPUSER<\/span>: spec\u00adi\u00adfy the user for con\u00adnect\u00ading to the Active Direc\u00adto\u00adry (or <span class=\"caps\">LDAP<\/span>) server.<\/li>\n<li><span class=\"caps\">LDAPPWD<\/span>: spec\u00adi\u00adfy the pass\u00adword for the <span class=\"caps\">LDAPUSER<\/span>.<\/li>\n<li><span class=\"caps\">CONNAME<\/span>: address of the Active Direc\u00adto\u00adry (or <span class=\"caps\">LDAP<\/span>) server<\/li>\n<li><span class=\"caps\">SECCOMM<\/span>: if this set\u00adting has an attribute of <span class=\"caps\">YES<\/span>, <span class=\"caps\">SSL<\/span> is used to con\u00adnect to the Active Direc\u00adto\u00adry (or <span class=\"caps\">LDAP<\/span>) serv\u00ader and also spec\u00adi\u00adfy the <span class=\"caps\">TCP<\/span> port as being 636 (<span class=\"caps\">LDAPS<\/span>); if it has the val\u00adue <span class=\"caps\">NO<\/span>, no <span class=\"caps\">SSL<\/span> will be used to con\u00adnect and the <span class=\"caps\">TCP<\/span> port is set to 389 (<span class=\"caps\">LDAP<\/span>).<\/li>\n<li><span class=\"caps\">SHORTUSR<\/span>: spec\u00adi\u00adfy the <span class=\"caps\">LDAP<\/span> attribute that con\u00adtains the \u201cshort\u201d user\u00adname. This is nec\u00ades\u00adsary because <span class=\"caps\">MQ<\/span> has a lim\u00adit of 12 char\u00adac\u00adters on user\u00adnames. If you do not spec\u00adi\u00adfy this option, user\u00adnames longer than 12 char\u00adac\u00adters will be truncated.<\/li>\n<li><span class=\"caps\">CLASSUSR<\/span>: <span class=\"caps\">LDAP<\/span> object class to use for user entries.<\/li>\n<li><span class=\"caps\">BASEDNU<\/span>: The base <span class=\"caps\">DN<\/span> of the <span class=\"caps\">LDAP<\/span> tree to use when search\u00ading for&nbsp;users.<\/li>\n<li><span class=\"caps\">USRFIELD<\/span>: The <span class=\"caps\">LDAP<\/span> attribute to be used by <span class=\"caps\">MQ<\/span> when search\u00ading for users; in Active Direc\u00adto\u00adry, this is typ\u00adi\u00adcal\u00adly sAMAccountName.<\/li>\n<li><span class=\"caps\">GRPFIELD<\/span>: The <span class=\"caps\">LDAP<\/span> attribute that con\u00adtains the short group name. If this option is miss\u00ading, the full group <span class=\"caps\">DN<\/span> must be used when spec\u00adi\u00adfy\u00ading groups in the set\u00admqaut com\u00admand line util\u00adi\u00adty and the <span class=\"caps\">SET<\/span> <span class=\"caps\">AUTHREC<\/span> <span class=\"caps\">MQSC<\/span> com\u00admand (more on these in anoth\u00ader blog post \u2014 stay tuned). Typ\u00adi\u00adcal\u00adly, this must hasve the val\u00adue <span style=\"font-family: andale mono, monospace;\">cn<\/span>.<\/li>\n<li><span class=\"caps\">CLASSGRP<\/span>: The <span class=\"caps\">LDAP<\/span> object class of groups.<\/li>\n<li><span class=\"caps\">CLASSUSR<\/span>: The <span class=\"caps\">LDAP<\/span> object class of users. In Microsoft Active Direc\u00adto\u00adry, this is typ\u00adi\u00adcal\u00adly <span style=\"font-family: andale mono, monospace;\">user<\/span>; for oth\u00ader <span class=\"caps\">LDAP<\/span> servers is typ\u00adi\u00adcal\u00adly <span style=\"font-family: andale mono, monospace;\">inetOrg\u00adPer\u00adson<\/span>.<\/li>\n<li><span class=\"caps\">BASEDNG<\/span>: The base <span class=\"caps\">DN<\/span> of the <span class=\"caps\">LDAP<\/span> tree to use when search\u00ading for groups.<\/li>\n<li><span class=\"caps\">FINDGRP<\/span>: The name of the attribute used with\u00adin an <span class=\"caps\">LDAP<\/span> entry to deter\u00admine group mem\u00adber\u00adship. The default val\u00adue depends on the val\u00adue of <span class=\"caps\">AUTHORMD<\/span>.<br>\nWhen <span class=\"caps\">AUTHORMD<\/span> = <span style=\"font-family: andale mono, monospace;\"><span class=\"caps\">SEARCHGRP<\/span><\/span>, the <span class=\"caps\">FINDGRP<\/span> attribute is typ\u00adi\u00adcal\u00adly set to <span style=\"font-family: andale mono, monospace;\">mem\u00adber<\/span> or <span style=\"font-family: andale mono, monospace;\">unique\u00adMem\u00adber<\/span>.<br>\nWhen <span class=\"caps\">AUTHORMD<\/span> = <span style=\"font-family: andale mono, monospace;\"><span class=\"caps\">SEARCHUSR<\/span><\/span>, the <span class=\"caps\">FINDGRP<\/span> attribute is typ\u00adi\u00adcal\u00adly set to <span style=\"font-family: andale mono, monospace;\">mem\u00adberOf<\/span>.<br>\nWhen <span class=\"caps\">AUTHORMD<\/span> = <span style=\"font-family: andale mono, monospace;\"><span class=\"caps\">SRCHGRPSN<\/span><\/span>, the <span class=\"caps\">FINDGRP<\/span> attribute is typ\u00adi\u00adcal\u00adly set to <span style=\"font-family: andale mono, monospace;\">mem\u00adberUid<\/span>. This only applies to <span class=\"caps\">MQ<\/span> ver\u00adsions 9.0.5 and&nbsp;above.<br>\nWhen the <span class=\"caps\">FINDGRP<\/span> attribute is left&nbsp;blank:\n<ul>\n<li>If <span class=\"caps\">AUTHORMD<\/span> = <span style=\"font-family: andale mono, monospace;\"><span class=\"caps\">SEARCHGRP<\/span><\/span>, the <span class=\"caps\">FINDGRP<\/span> attribute defaults to <span style=\"font-family: andale mono, monospace;\">mem\u00adberOf<\/span>.<\/li>\n<li>If <span class=\"caps\">AUTHORMD<\/span> = <span style=\"font-family: andale mono, monospace;\"><span class=\"caps\">SEARCHUSR<\/span><\/span>, the <span class=\"caps\">FINDGRP<\/span> attribute defaults to <span style=\"font-family: andale mono, monospace;\">mem\u00adber<\/span>.<\/li>\n<li>If <span class=\"caps\">AUTHORMD<\/span> = <span style=\"font-family: andale mono, monospace;\"><span class=\"caps\">SRCHGRPSN<\/span><\/span>, the <span class=\"caps\">FINDGRP<\/span> attribute defaults to <span style=\"font-family: andale mono, monospace;\">mem\u00adberUid<\/span>. This only applies to <span class=\"caps\">MQ<\/span> ver\u00adsions 9.0.5 and&nbsp;above.<\/li>\n<\/ul>\n<\/li>\n<li><span class=\"caps\">AUTHORMD<\/span>: See expla\u00adna\u00adtion of the <span class=\"caps\">FINDGRP<\/span> parameter.<\/li>\n<\/ul>\n<p>Keep in mind that for an authen\u00adti\u00adca\u00adtion of type <span class=\"caps\">IDPWLDAP<\/span>, <span class=\"caps\">REQDADM<\/span> and <span class=\"caps\">OPTIONAL<\/span> are equiv\u00ada\u00adlent, as <span class=\"caps\">MQ<\/span> makes no dis\u00adtinc\u00adtion between admin\u00adis\u00adtra\u00adtive users and nor\u00admal ones. An user\u00adname and pass\u00adword are always request\u00aded and val\u00adi\u00addat\u00aded, and are required to be cor\u00adrect, that is, authen\u00adti\u00adca\u00adtion must succeed.<\/p>\n<p>Again, to use this authen\u00adti\u00adca\u00adtion con\u00adfig\u00adu\u00adra\u00adtion, issue the run\u00admqsc command:<\/p>\n<p class=\"code-example\"><span class=\"caps\">ALTER<\/span> <span class=\"caps\">QMGR<\/span> <span class=\"caps\">CONNAUTH<\/span>(<span class=\"caps\">USE<\/span>.<span class=\"caps\">LDAP<\/span>)<\/p>\n<p>and restart the queue man\u00adag\u00ader or issue the run\u00admqsc command:<\/p>\n<p class=\"code-example\"><span class=\"caps\">REFRESH<\/span> <span class=\"caps\">SECURITY<\/span> <span class=\"caps\">TYPE<\/span>(<span class=\"caps\">CONNAUTH<\/span>)<\/p>\n<p>That\u2019s it. The next thing to do is to autho\u00adrize users to use <span class=\"caps\">MQ<\/span> by set\u00adting per\u00admis\u00adsions (autho\u00adriza\u00adtions). This will be shown in part 3 of this arti\u00adcle series.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>User authen\u00adti\u00adca\u00adtion is anoth\u00ader aspect of secu\u00adri\u00adty that is often over\u00adlooked and many think it only applies to human&nbsp;users. Quite the con\u00adtrary! User authen\u00adti\u00adca\u00adtion, albeit with a few twists, is an essen\u00adtial aspect for secur\u00ading appli\u00adca\u00adtions\u2019 access to resources. <span class=\"caps\">IBM<\/span> \u2026 <a href=\"https:\/\/trindade.myphotos.cc\/lazysysadmin\/2020\/08\/31\/ibm-mq-basics-security-part-2-user-authentication\/\">Con\u00adtin\u00adue read\u00ading <span class=\"meta-nav\">\u2192<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"wp_typography_post_enhancements_disabled":false,"footnotes":""},"categories":[20,2,3,21],"tags":[5,10,12,4,8,6,13],"class_list":["post-161","post","type-post","status-publish","format-standard","hentry","category-basics","category-middleware","category-mq","category-security","tag-ibm","tag-ibm-mq","tag-ibmmq","tag-mq","tag-mqseries","tag-websphere-mq","tag-webspheremq"],"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"Ant\u00f3nio Trindade","author_link":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/author\/trindade\/"},"_links":{"self":[{"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/posts\/161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/comments?post=161"}],"version-history":[{"count":13,"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/posts\/161\/revisions"}],"predecessor-version":[{"id":247,"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/posts\/161\/revisions\/247"}],"wp:attachment":[{"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/media?parent=161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/categories?post=161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trindade.myphotos.cc\/lazysysadmin\/wp-json\/wp\/v2\/tags?post=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}