Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in
Deleted user
0 / 0 points
Next:
badges earned

Your Points Tracker
Challenges
Leaderboard
  • Global
  • Feed

Badge for your thoughts?

You're enrolled in our new beta rewards program. Join our group to get the inside scoop and share your feedback.

Join group
Recognition
Give the gift of kudos
You have 0 kudos available to give
Who do you want to recognize?
Why do you want to recognize them?
Kudos
Great job appreciating your peers!
Check back soon to give more kudos.

Past Kudos Given
No kudos given
You haven't given any kudos yet. Share the love above and you'll see it here.

It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

Desativação Automatizada de Usuários | Gestão de Licenças com API Edited

Olá pessoal, tudo bom? Espero que sim!

giphy.gif?cid=ecf05e4796sngkt20acrq1waboh51rpxcxr8vv0aukycv1a8&rid=giphy

Aqui na nossa empresa não utilizamos a integração da suíte Atlassian com o AD, então o processo de gestão de acesso dos usuários costumava gerar um overload operacional bem alto.

Este ano - muito graças à pandemia - tivemos um aumento substancial de usuários em nossas ferramentas, e a automação da criação/desativação/reativação e inclusão em grupos tornou-se extremamente necessária.

Desenvolvi diversos scripts recentemente, e hoje trouxe pra vocês um dos mais simples de ser configurado: A desativação automatizada de usuários via REST API.

  • Por que? Tivemos um problema antes de aumentarmos a nossa licença com a questão da limitação de usuários, já que o processo de coleta/desativação de usuários inativos por x dias não havia amadurecido o suficiente para ser utilizado com a frequência que estava sendo utilizada (quase diariamente).
  • Pré-requisitos técnicos: 
    • Acesso administrativo à aplicação do Jira (para acesso às API's de gerenciamento de usuários);
    • Acesso administrativo ao servidor de Banco de Dados do JIRA;
    • BD deve estar hospedado em um servidor Linux.
  • Limitações: Não sei como funciona a parte de gestão de acessos no Jira Cloud, então não sei dizer como replicar o script nem se ele funciona para a Cloud. Sorry. =(
  • Versão do Jira: Jira v8.5.1
  • Versão do SQLPlus: Release 12.1.0.2.0 Production

Vamos começar?

giphy

 

OS ARQUIVOS

Tenho 2 recomendações sobre o local dos arquivos: 

  • Preferível que estejam no mesmo diretório;
  • Preferível que fiquem em /home/oracle.

Caso opte por deixá-los em outros locais, prepare-se para resolver alguns problemas de permissionamento.

Arquivo query.sql:

Esta query coleta uma lista com o nome de usuário dos usuários que estão a X dias sem acesso e foram criados/reativados há mais de Y dias.

set pagesize 999
set heading off
set echo off
set feedback off
set verify off
SELECT "USER_NAME" FROM
(SELECT "USER_NAME","ACTIVE","CREATED_DATE","UPDATED_DATE",NVL(B.LOGIN_COUNT,0)
AS LOGIN_COUNT, TO_CHAR(C.LAST_LOGIN,'DD/MM/YYYY') AS LAST_LOGIN,
ROUND(CURRENT_DATE - LAST_LOGIN,0) AS LASTLOGINCOUNT,
ROUND(CURRENT_DATE - UPDATED_DATE,0) AS UPDATEDCOUNT,
ROUND(CURRENT_DATE - CREATED_DATE,0) AS COUNTCREATION FROM "CWD_USER" A
LEFT JOIN
(SELECT "USER_ID","ATTRIBUTE_NAME","ATTRIBUTE_VALUE" AS LOGIN_COUNT FROM "CWD_USER_ATTRIBUTES" WHERE ATTRIBUTE_NAME = 'login.count') B
ON A.ID = B.USER_ID
LEFT JOIN
(SELECT "USER_ID","ATTRIBUTE_NAME", TO_DATE('01.01.1970','dd.mm.yyyy') + TO_NUMBER("ATTRIBUTE_VALUE")/1000/60/60/24 AS LAST_LOGIN FROM "CWD_USER_ATTRIBUTES" WHERE ATTRIBUTE_NAME = 'lastAuthenticated') C
ON A.ID = C.USER_ID)
WHERE "ACTIVE"=1
AND (("LASTLOGINCOUNT" IS NULL AND ("COUNTCREATION">$dias_desde_a_criação AND "UPDATEDCOUNT">$dias_desde_a reativação)) OR "LASTLOGINCOUNT">$dias_desde_ultimo_login AND "UPDATEDCOUNT">$dias_desde_a reativação)
ORDER BY USER_NAME;
exit

Variáveis para customização:

  • dias_desde_a_criação: Espaço de dias que o usuário pode ficar sem acessar desde que o usuário é criado - para evitar a desativação de usuários que ainda não tiveram tempo de acessar desde a solicitação de acesso, nós deixamos 10 por aqui;
  • dias_desde_a_reativação: A mesma coisa que o bullet acima, mas referente a reativação do usuário, nós deixamos 10 por aqui;
  • dias_desde_ultimo_login: Dias sem acesso para que o usuário seja desativado, nós deixamos 40 por aqui - para evitar desativar usuários que estão de férias.

Arquivo script.sh:

Este script lê a lista coletada acima e acessa as APIs do jira para desativá-los. As entradas de log são opcionais. Por favor tome nota do comentário inserido antes do comando "tail -n +18 users_1.csv > users_2.csv", já que a não adaptação desta linha pode fazer com que a coleta de usuários não seja bem sucedida.

#!/bin/bash

# Salvando o diretório de execução do script.
EXEC_PATH=$PWD
# Fazendo login com o usuário do oracle e rodando a query de coleta dos usuários.
sudo su - oracle -c "sqlplus -s $usuario_do_BD_do_jira/$senha_do_usuario_do_BD_do_jira @$EXEC_PATH/querr.sql" > users_1.csv

# O comando acima faz o login com o usuário do oracle e recarrega as 
# variáveis de ambiente, temos um banner de login que - no meu caso - 
# ocupa 18 linhas. Ao rodar na primeira vez, comente todas as linhas 
# abaixo deste comentário e cheque o arquivo users_1.csv para verificar 
# se você precisará remover alguma linha do cabeçalho, se sim substitua 
# o 18 no comando abaixo pela quantidade de linhas que deverão ser 
# removidas do arquivo.
tail -n +18 users_1.csv > users_2.csv

# Coletando dia e hora para log.
function getdate() {date +"%F %T"}

# Entradas de execução para log.
echo "########################################################################"
echo "$(getdate) Inicio da execução do script de clean-up de usuários"

# Leitura do arquivo com os usuários e execução.
while IFS="," read user_name
do
echo -e "Desativando usuario: $user_name..."
curl -s -X PUT $url_do_jira/rest/api/2/user?username=${user_name} \
-u $usuario_administrativo_do_jira:$senha_do_usuario_administrativo_do_jira \
-H 'Content-Type: application/json; charset=utf-8' \
--data '{"active": "false"}'
sleep 2
done < users_2.csv

# Deleção de arquivos criados
rm -f *.csv

# Entradas de execução para log.
echo "$(getdate) Término da execução do script de clean-up de usuários"

Variáveis para customização:

  • usuario_do_BD_do_jira: nome auto-explicativo;
  • senha_do_usuario_do_BD_do_jira: nome auto-explicativo;
  • url_do_jira:nome auto-explicativo;
  • usuario_administrativo_do_jiranome auto-explicativo;
  • senha_do_usuario_administrativo_do_jiranome auto-explicativo;

 

PERMISSÕES

Caso opte por deixar o usuário/senha hardcoded no script, recomendo ajustar as permissões dos arquivos conforme abaixo:

-r-x------ 1 oracle oinstall 1027 Aug 24 11:52 query.sql
-r-x------ 1 root root 341 Aug 24 11:56 script.sh

Desta forma os únicos com acesso para execução e leitura são os owners/grupos dos arquivos:

chmod 500 query.sql
chmod 500 script.sh

Note também que alterei o owner/grupo do arquivo query.sql:

chown oracle query.sql
chgrp oinstall query.sql

Fiz isto pois por padrão só é possível agendar tarefas no crontab do root, portanto o script será executado com o usuário do root.

No entanto precisaremos fazer login dentro do script com o usuário do oracle, e ele não conseguirá acessar o arquivo caso não seja o owner.

 

AGENDAMENTO

Para configurar a execução diária deste script, basta incluir uma linha no cron do servidor:

crontab -e

O formato de agendamento do crontab pode variar dependendo do tipo e versão do seu SO, mas aqui no nosso servidor, configuramos desta forma: execução diária às 06 da manhã, com output salvo no arquivo de log logdoscript.log, salvo no mesmo diretório dos scripts.

00 06 * * * $diretorio_do_script/script.sh >> $diretorio_do_script/logdoscript.log

Variáveis para customização:

  • diretorio_do_script: nome auto-explicativo;

giphy

Fui aprendendo algumas coisas na tentativa e erro ao longo de tempo e apanhei bastante pra descobrir alguns pontos descritos aqui em cima, então espero ter coberto a maioria das dúvidas/problemas que vocês possam ter.

Disclaimer: não sou nem tenho experiência com a área de Desenvolvimento, então provavelmente existe espaço pra melhoria no código e na documentação do código. Sugestões serão sempre bem vindas. =)

1 comment

Muito obrigada @Julia Nunes Pedrosa por compartilhar com todos nós o seu desafio de forma tão rica e detalhada!

Parabéns você mandou super bem!!!

Comment

Log in or Sign up to comment
TAGS

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you