Me deparei esses dias com o seguinte problema: alterar as senhas de um grupo de servidores ao mesmo tempo. De inicio parece um problema simples, mas depois vimos que havia o problema dos certificados de autentica\u00e7\u00e3o com o que alguns usu\u00e1rios entravam nos servidores e para piorar, alguns servidores precisam se comunicar entre eles e por se fosse pouco, o gestor queria aproveitar para limpar os certificados de acesso para deixar s\u00f3 o m\u00ednimo necess\u00e1rios.<\/p>\n
Bom, se h\u00e1 um m\u00ednimo necess\u00e1rio -pensei- \u00e9 por ai que come\u00e7aremos. Desenvolvi um script que fa\u00e7o aqui publico tendo como ponto de partida duas coisas: Uma lista de servidores e um conjunto dos certificados m\u00ednimos que \u00e9 necess\u00e1rio para garantir que certos usu\u00e1rios possam acessar o conjunto de servidores.<\/p>\n
Para poder rodar o script, voc\u00ea precisa ter o netcat<\/em> instalado em sua m\u00e1quina assim como acesso certificado aos servidores em quest\u00e3o (no nosso caso mais de 7 servidores usando CentOS, Redhat, Debian e Ubuntu).<\/p>\n Instalar o netcat<\/em> se resume a puxar ele do reposit\u00f3rio. Por exemplo, em Ubuntu fica assim:<\/p>\n Para certificar-se perante os servidores, voc\u00ea primeiro cria um par de chaves assim:<\/p>\n E mande enter em tudo<\/p>\n Depois voc\u00ea copia sua chave para os servidores como no seguinte exemplo:<\/p>\n Isso supondo que se trata do servidor com ip 192.168.0.9 e o usu\u00e1rio root<\/em>. Falando nisso, sem acesso root aos servidores, nada feito.<\/p>\n Repita esta \u00faltima opera\u00e7\u00e3o para cada servidor da sua rede.<\/p>\n Depois crie uma pasta na qual colocar\u00e1 o script que est\u00e1 no final deste post.<\/p>\n Al\u00e9m do script, crie um arquivo chamado newPassword<\/em> dentro da pasta contendo unicamente a nova senha.<\/p>\n Tamb\u00e9m crie um arquivo chamado servers.txt<\/em> contendo a lista dos IPs dos seus servidores.<\/p>\n Crie um arquivo authorized_keys<\/em> nessa pasta contendo as chaves p\u00fablicas que voc\u00ea deseja permitir acesso em todos os servidores da lista. Ou seja, em cada linha deste arquivo v\u00e1 sua chave p\u00fablica, a chave do seu colega, do seu chefe, e assim por diante.<\/p>\n Garanta direitos de execu\u00e7\u00e3o ao script assim:<\/p>\n E finalmente rode o script.<\/p>\n O scrips percorrera a lista de IPs, verificar\u00e1 o tipo de servidor que \u00e9 (a linhagem, na realidade) e se lhe for poss\u00edvel (redhat e debian) alterar\u00e1 a senha do root para a indicada. Recolher\u00e1 a chave p\u00fablica desse servidor para disponibiliz\u00e1-la ao grupo de servidores. Dessa forma, eles passam a se conhecer e n\u00e3o precisam de senha.<\/p>\n Cria um arquivo tempor\u00e1rio authorized_keys<\/em> contendo os certificados liberados para os usu\u00e1rios mais os certificados de cada servidor da lista.<\/p>\n Finalmente. Coloca o novo authorized_keys<\/em> em cada servidor. Limpa a entrada correspondente a cada servidor substituindo-as pelas novas.<\/p>\n Me deparei esses dias com o seguinte problema: alterar as senhas de um grupo de servidores ao mesmo tempo. De inicio parece um problema simples, mas depois vimos que havia o problema dos certificados de autentica\u00e7\u00e3o com o que alguns usu\u00e1rios entravam nos servidores e para piorar, alguns servidores precisam se comunicar entre eles e […]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false},"categories":[95],"tags":[],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5O6UV-3P","jetpack-related-posts":[{"id":473,"url":"http:\/\/www.yeapf.com\/wp\/?p=473","url_meta":{"origin":237,"position":0},"title":"CentOS 6.9 com PHP7.2 e Curl atualizado","date":"setembro 27, 2018","format":false,"excerpt":"Nosso sistema de gest\u00e3o de pequenas cl\u00ednicas utiliza um controle distribu\u00eddo de n\u00f3s para manter a sequencialidade do prontu\u00e1rio e a integridade dos dados entre outras coisas. Uma das exig\u00eancias desse imbr\u00f3glio todo \u00e9 que rode sobre SSL. Por raz\u00f5es de testes de compatibilidade, mantemos CentOS 6.9 em alguns servidores\u2026","rel":"","context":"Em "Servidores"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":485,"url":"http:\/\/www.yeapf.com\/wp\/?p=485","url_meta":{"origin":237,"position":1},"title":"Migrando HyperV para KVM","date":"outubro 16, 2018","format":false,"excerpt":"\u00c9 obvio que qualquer um que me conhe\u00e7a vai saber de como valorizo o KVM e tudo o que for software livre (Ali\u00e1s, qualquer coisa que seja\u00a0livre) Estes dias me veio o problema de migrar uma m\u00e1quina que estava em uma HyperV para o KVM. O problema se resume ao\u2026","rel":"","context":"Em "Servidores"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":269,"url":"http:\/\/www.yeapf.com\/wp\/?p=269","url_meta":{"origin":237,"position":2},"title":"Gerenciando acesso a servi\u00e7os com v\u00e1rios IPs","date":"janeiro 21, 2016","format":false,"excerpt":"At\u00e9 n\u00e3o faz muito tempo bloquear um site era sin\u00f4nimo de bloquear o servi\u00e7o Com os servi\u00e7os na nuvem, uma empresa pode fazer uso de v\u00e1rios servidores (com seus respectivos IPs)\u00a0para fornecer o seu servi\u00e7o. Tome por exemplo o WhatsApp ou o Facebook. Neste post, pretendo lhe ajudar a puxar\u2026","rel":"","context":"Em "Route Sentry"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":601,"url":"http:\/\/www.yeapf.com\/wp\/?p=601","url_meta":{"origin":237,"position":3},"title":"Oracle XE 10.2g e PHP 5.6 sobre Ubuntu 20","date":"fevereiro 11, 2021","format":false,"excerpt":"Recentemente me solicitaram colaborar em um problema de conex\u00e3o entre OracleXE 10.2g e PHP 5.6 Por serem duas plataformas antigas, precisei montar meus servidores para emular tal situa\u00e7\u00e3o. Como na descri\u00e7\u00e3o n\u00e3o veio se era Apache ou Nginx e o comum era usar o Apache2 e me indicaram estar rodando\u2026","rel":"","context":"Em "Desenvolvimento"","img":{"alt_text":"","src":"https:\/\/i2.wp.com\/www.yeapf.com\/wp\/wp-content\/uploads\/2021\/02\/Screen-Shot-2021-02-10-at-23.29.01.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":38,"url":"http:\/\/www.yeapf.com\/wp\/?p=38","url_meta":{"origin":237,"position":4},"title":"BlackBerry QNX e o uso em aplicativos de sa\u00fade","date":"mar\u00e7o 8, 2014","format":false,"excerpt":"Meu primeiro contato com dispositivos m\u00f3veis foi na \u00e1rea comercial onde havia que fazer levantamento de dados.\u00a0 Naquela \u00e9poca nem se falava em wifi e a melhor forma de interface com o computador era o velho e querido RS-232.\u00a0 Voc\u00ea fazia o levantamento, depois ia at\u00e9 o computador, descarregava os\u2026","rel":"","context":"Em "Opini\u00e3o"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":248,"url":"http:\/\/www.yeapf.com\/wp\/?p=248","url_meta":{"origin":237,"position":5},"title":"Monitorando servi\u00e7os em linux","date":"novembro 10, 2015","format":false,"excerpt":"Assumir o compromisso de manter um servidor funcionando requer de poder monitorar ele e realizar as tarefas preventivas necess\u00e1rias. O servi\u00e7o simpleCollector\u00a0tem a vantagem de poder receber qualquer tipo de indicador que o cliente queira criar e monta-lo sobre uma linha de tempo disparando os gatilhos que forem programados sobre\u2026","rel":"","context":"Em "Servidores"","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/237"}],"collection":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=237"}],"version-history":[{"count":2,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/237\/revisions"}],"predecessor-version":[{"id":239,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/237\/revisions\/239"}],"wp:attachment":[{"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.yeapf.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}sudo apt-get install nc<\/pre>\n
ssh-key-gen<\/pre>\n
ssh-copy-id root@192.168.0.9<\/pre>\n
chmod +x updateServerPasswords.sh<\/pre>\n
.\/updateServerPasswords.sh<\/pre>\n
Como funciona<\/h3>\n
\u00a0O script<\/h3>\n
#!\/bin\/bash\r\n#\r\n# The MIT License (MIT)\r\n#\r\n# Copyright (c) 2015 Esteban Daniel Dortta\r\n#\r\n# Permission is hereby granted, free of charge, to any person obtaining a copy\r\n# of this software and associated documentation files (the \"Software\"), to deal\r\n# in the Software without restriction, including without limitation the rights\r\n# to use, copy, modify, merge, publish, distribute, sublicense, and\/or sell\r\n# copies of the Software, and to permit persons to whom the Software is\r\n# furnished to do so, subject to the following conditions:\r\n#\r\n# The above copyright notice and this permission notice shall be included in\r\n# all copies or substantial portions of the Software.\r\n#\r\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n# THE SOFTWARE.\r\n\r\nfunction checkPort\r\n{\r\n\u00a0\u00a0\u00a0 nc -z $1 $2\r\n\u00a0\u00a0\u00a0 if [ $? -lt 1 ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 echo 1\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 echo 0\r\n\u00a0\u00a0\u00a0 fi\r\n}\r\n\r\nif [ ! -d ssh-backup ]; then\r\n\u00a0 mkdir ssh-backup\r\nfi\r\n\r\necho \"~\/.ssh\/known_hosts\" > \/tmp\/remove_known_hosts.sh\r\n\r\nknown=''\r\nwinHosts=''\r\n\r\nif [ $# -lt 1 ]; then\r\n\u00a0 serverList=`(cat servers.txt)`\r\nelse\r\n\u00a0 if [ -f \"$1\" ]; then\r\n\u00a0\u00a0\u00a0 serverList=`(cat \"$1\")`\r\n\u00a0 else\r\n\u00a0\u00a0\u00a0 serverList=$1\r\n\u00a0 fi\r\nfi\r\nfor ip in $serverList; do\r\n\u00a0 ping -c 1 $ip > \/dev\/null\r\n\u00a0 ret=$?\r\n\u00a0 ret=`(echo $ret | awk '{ print $1 }')`\r\n\u00a0 if [ $ret -gt 0 ]; then\r\n\u00a0\u00a0\u00a0 ret=\"\"\r\n\u00a0 else\r\n\u00a0\u00a0\u00a0 ret=\"OK\"\r\n\u00a0 fi\r\n\r\n\u00a0 port=''\r\n\u00a0 if [ \"$ret\" == \"OK\" ]; then\r\n\u00a0\u00a0\u00a0 ok22=$(checkPort $ip 22)\r\n\u00a0\u00a0\u00a0 if [ $ok22 -lt 1 ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 ok2002=$(checkPort $ip 2002)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if [ $ok2002 -lt 1 ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ok135=$(checkPort $ip 135)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if [ $ok135 -gt 0 ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 port=135\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 port=2002\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 port=22\r\n\u00a0\u00a0\u00a0 fi\r\n\r\n\u00a0\u00a0\u00a0 unknownDistro=\"UNKNOWN\"\r\n\u00a0\u00a0\u00a0 RHDistro=\"Redhat\"\r\n\u00a0\u00a0\u00a0 DebianDistro=\"Debian\"\r\n\r\n\u00a0\u00a0\u00a0 if [ \"$port\" == \"22\" ] || [ \"$port\" == \"2002\" ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 redhat=`(ssh -p $port root@$ip [[ -f \/etc\/redhat-release ]] && echo $?)`\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 debian=`(ssh -p $port root@$ip [[ -f \/etc\/debian_version ]] && echo $?)`\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 distro=\"$unknownDistro\"\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if [ $redhat -eq 0 ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 distro=\"$RHDistro\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if [ $debian -eq 0 ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 disto=\"$DebianDistro\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 echo -e \"$port\\t$ip\\t$distro ---------------------------------------------\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if [ $distro != \"$unknownDistro\" ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 scp -P $port newPassword root@$ip:\/tmp\/newPassword\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if [ \"$distro\" == \"$RHDistro\" ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echo \"Changing Redhat style password\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ssh -p $port root@$ip \"passwd root --stdin < \/tmp\/newPassword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if [ \"$distro\" == \"$DebianDistro\" ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echo \"Changing Debian style password\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ssh -p $port root@$ip \"sed 's\/^\/root\\:\/' \/tmp\/newPasswd | chpasswd\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ssh -p $port root@$ip rm \/tmp\/newPassword\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 fi\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 scp -P $port root@$ip:\/root\/.ssh\/id_rsa.pub ssh-backup\/id_rsa_$ip.pub\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 scp -P $port root@$ip:\/root\/.ssh\/authorized_keys ssh-backup\/authorized_keys.$ip\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 echo \"ssh-keygen -R [$ip]:$port\" >> \/tmp\/remove_known_hosts.sh\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 echo \"ssh-keyscan -p $port -H $ip >> ~\/.ssh\/known_hosts\" >> \/tmp\/remove_known_hosts.sh\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 known=\"$known$ip:$port \";\r\n\u00a0\u00a0\u00a0 fi\r\n\r\n\u00a0\u00a0\u00a0 if [ \"$port\" == \"135\" ]; then\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 winHosts=\"$winHosts \";\r\n\u00a0\u00a0\u00a0 fi\r\n\u00a0 fi\r\n\r\n\u00a0 if [ \"$port\" == \"\" ]; then\r\n\u00a0\u00a0\u00a0 echo -e \"(n\/a)\\t$ip ---------------------------------------------\"\r\n\u00a0 fi\r\n\r\ndone\r\n\r\ncat authorized_keys > \/tmp\/authorized_keys\r\nfor server in $known; do\r\n\u00a0 ip=`echo $server | awk -F: '{ print $1 }'`\r\n\u00a0 cat ssh-backup\/id_rsa_$ip.pub >> \/tmp\/authorized_keys\r\ndone\r\n\r\nfor server in $known; do\r\n\u00a0 ip=`echo $server | awk -F: '{ print $1 }'`\r\n\u00a0 port=`echo $server | awk -F: '{ print $2 }'`\r\n\u00a0 echo \"Copying to $ip:$port ---------------------------------------\"\r\n\u00a0 scp -P $port \/tmp\/remove_known_hosts.sh root@$ip:\/tmp\/remove_known_hosts.sh\r\n\u00a0 ssh -p $port root@$ip chmod +x \/tmp\/remove_known_hosts.sh\r\n\u00a0 ssh -p $port root@$ip \/tmp\/remove_known_hosts.sh\r\n\r\n\u00a0 scp -P $port \/tmp\/authorized_keys root@$ip:\/root\/.ssh\/authorized_keys\r\n\u00a0 ssh -p $port root@$ip chmod 0600 \/root\/.ssh\/authorized_keys\r\ndone\r\n\r\necho \"Windows hosts: $winHosts\"<\/pre>\n","protected":false},"excerpt":{"rendered":"