Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Autenticação 2FA para Usuário Root no WSL

--- # naldodj-wsl-2FA ## Autenticação 2FA para Usuário Root no WSL ### Introdução O Windows Subsystem for Linux (WSL) é uma ferramenta poderosa que permite aos desenvolvedores executar um ambiente Linux diretamente no Windows. No entanto, a segurança é uma preocupação importante, especialmente quando se trata de acessar o usuário root. Neste post, vamos mostrar como configurar a autenticação de dois fatores (2FA) para o usuário root ao acessar o WSL, garantindo uma camada adicional de segurança. ### Objetivo Vamos configurar um script de login que valida a senha do root e usa autenticação 2FA baseada em Time-based One-Time Password (TOTP), usando ferramentas comuns como `openssl`, `oathtool`, e `perl`. ### Passo 1: Instalar as Ferramentas Necessárias Primeiro, precisamos garantir que temos todas as ferramentas necessárias instaladas. Isso inclui `openssl`, `oathtool`, e `perl`. ```bash sudo apt-get update sudo apt-get install openssl oathtool perl ``` Para os scripts em Lua.

BlackTDN :: Consulta Padrão Específica utilizando f_Opcoes

   1: #include "totvs.ch"
   2: Static __aF3Ret
   3: /*
   4:     Programa    : f3f_Opcoes
   5:     Funcao      : f3fOpcSX5
   6:     Data        : 16/06/2014
   7:     Autor       : Marinaldo de Jesus ( http://www.blacktdn.com.br )
   8:     Descricao   : Programa para retornar Consulta Padrao "Específica" baseada em f_Opcoes
   9:     Uso         : Consulta F3 (%F3SIT) para as situacoes da Folha de Pagamento
  10:     Sintaxe     : StaticCall(F3F_OPCOES,f3fOpcSX5,cTabela,nSize,cF3,cF3Name)
  11: */
  12: Static Function f3fOpcSX5(cTabela,nSize,cF3,cF3Name)
  13:     
  14:     //------------------------------------------------------------------------------------------------
  15:     // Salva os Dados de Entrada que serao restaurados antes do Retorno do Procedimento
  16:     Local aArea    := GetArea()
  17:     Local aAreaSX5 := SX5->(GetArea())
  18:  
  19:     Local aOpcoes  := Array(0)
  20:  
  21:     Local cKey
  22:     Local cDes
  23:  
  24:     //------------------------------------------------------------------------------------------------
  25:     // Obtem um alias válido par uso
  26:     Local cAlias   := GetNextAlias()
  27:  
  28:     Local cTitulo  := ""
  29:     Local cOpcoes  := ""
  30:  
  31:     //------------------------------------------------------------------------------------------------
  32:     // Obtem a Variavel de Memória que será utilizada como Referencia à Consulta
  33:     Local cReadVar := ReadVar()
  34:     
  35:     Local nCnt     := 0
  36:     
  37:     Local nRecno
  38:     Local nF3Ret
  39:     Local nTamKey
  40:     Local nElemRet
  41:  
  42:     //------------------------------------------------------------------------------------------------
  43:     // Obtem a Ordem para a tabela SX5
  44:     Local nSX5Order := RetOrder("SX5","X5_FILIAL+X5_TABELA+X5_CHAVE")
  45:  
  46:     Local uVarRet
  47:  
  48:     //------------------------------------------------------------------------------------------------
  49:     // Obtem o conteúdo do campo utilizado na Consulta Padrao Customizada
  50:     uVarRet := GetMemVar(cReadVar)
  51:  
  52:     //------------------------------------------------------------------------------------------------
  53:     // Valor padrão para Tamanho do Campo
  54:     DEFAULT nSize := Len(uVarRet)
  55:  
  56:     //------------------------------------------------------------------------------------------------
  57:     // Obtem o conteúdo do campo utilizado na Consulta Padrao Customizada
  58:     nTamKey    := nSize
  59:     
  60:     //------------------------------------------------------------------------------------------------
  61:     // Verifica o Máximo de Elementos para Retorno/Seleção
  62:     nElemRet    := Int(Len(uVarRet)/nTamKey)
  63:     
  64:     //------------------------------------------------------------------------------------------------
  65:     // Obtem a Descrição, conforme tabela
  66:     SX5->(dbSetOrder(nSX5Order))
  67:     IF SX5->(dbSeek(xFilial("SX5")+"00"+cTabela))
  68:         cTitulo := SX5->(X5Descri())
  69:     EndIF
  70:     
  71:     //------------------------------------------------------------------------------------------------
  72:     // Seleciona os Registros
  73:     BEGINSQL ALIAS cAlias
  74:         COLUMN R_E_C_N_O_ AS NUMERIC(16,0)
  75:         SELECT SX5.R_E_C_N_O_
  76:           FROM %table:SX5% SX5
  77:          WHERE SX5.%notDel%
  78:            AND SX5.X5_FILIAL=%xFilial:SX5%
  79:            AND SX5.X5_TABELA=%exp:cTabela% 
  80:     ENDSQL
  81:     
  82:     //------------------------------------------------------------------------------------------------
  83:     // Obtem a Chave e Descricao
  84:     While (cAlias)->(.NOT.(Eof()))
  85:         nRecno := (cAlias)->R_E_C_N_O_    
  86:         SX5->(dbGoto(nRecno))
  87:         cKey := SX5->(Left(X5_CHAVE,nTamKey))
  88:         cDes := SX5->(Alltrim(X5Descri()))
  89:         aAdd(aOpcoes,cKey+" - "+cDes)
  90:         cOpcoes += cKey
  91:         ++nCnt
  92:         (cAlias)->(dbSkip())
  93:     End While
  94:     
  95:     //------------------------------------------------------------------------------------------------
  96:     // Libera o Alias da Memoria
  97:     (cAlias)->(dbCloseArea())
  98:  
  99:     //------------------------------------------------------------------------------------------------
 100:     // Redefine o Máximo de Elementos para Retorno/Seleção
 101:     nElemRet    := Min(nCnt,nElemRet)
 102:  
 103:     //------------------------------------------------------------------------------------------------
 104:     // Executa f_Opcoes para Selecionar ou Mostrar os Registros Selecionados
 105:     IF f_Opcoes(    @uVarRet    ,;    //Variavel de Retorno
 106:                     cTitulo     ,;    //Titulo da Coluna com as opcoes
 107:                     @aOpcoes    ,;    //Opcoes de Escolha (Array de Opcoes)
 108:                     @cOpcoes    ,;    //String de Opcoes para Retorno
 109:                     NIL         ,;    //Nao Utilizado
 110:                     NIL         ,;    //Nao Utilizado
 111:                     .F.         ,;    //Se a Selecao sera de apenas 1 Elemento por vez
 112:                     nTamKey     ,;    //Tamanho da Chave
 113:                     nElemRet    ,;    //No maximo de elementos na variavel de retorno
 114:                     .T.         ,;    //Inclui Botoes para Selecao de Multiplos Itens
 115:                     .F.         ,;    //Se as opcoes serao montadas a partir de ComboBox de Campo ( X3_CBOX )
 116:                     NIL         ,;    //Qual o Campo para a Montagem do aOpcoes
 117:                     .F.         ,;    //Nao Permite a Ordenacao
 118:                     .F.         ,;    //Nao Permite a Pesquisa    
 119:                     .F.         ,;    //Forca o Retorno Como Array
 120:                     cF3          ;    //Consulta F3    
 121:                   )
 122:         //------------------------------------------------------------------------------------------------
 123:         // Atualiza a Variável de Retorno
 124:         cF3Ret    := uVarRet
 125:         //------------------------------------------------------------------------------------------------
 126:         // Atualiza a Variável de Memória com o Conteúdo do Retorno
 127:         SetMemVar(cReadVar,cF3Ret)
 128:         //------------------------------------------------------------------------------------------------
 129:         // Força a atualização dos Componentes (Provavelmente não irá funcionar). A solução. ENTER
 130:         SysRefresh(.T.)
 131:     Else
 132:         //------------------------------------------------------------------------------------------------
 133:         // Se nao confirmou a f_Opcoes retorna o Conteudo de entrada
 134:         cF3Ret    := uVarRet
 135:     EndIF
 136:     
 137:     //------------------------------------------------------------------------------------------------
 138:     // Alimenta a variável Static para uso no Retorno da Consulta Padrao.
 139:     DEFAULT __aF3Ret := Array(0)
 140:     nF3Ret := aScan(__aF3Ret,{|e|e[1]==cF3Name})
 141:     IF (nF3Ret==0)
 142:         aAdd(__aF3Ret,{cF3Name,NIL})
 143:         nF3Ret    := Len(__aF3Ret)
 144:     EndIF
 145:     __aF3Ret[nF3Ret][2] := cF3Ret
 146:     
 147:     //------------------------------------------------------------------------------------------------
 148:     // Restaura os Dados de Entrada
 149:     RestArea(aAreaSX5)
 150:     RestArea(aArea)
 151:  
 152: Return(cF3Ret)
 153:  
 154: /*
 155:     Programa    : f3f_Opcoes
 156:     Funcao      : f3fOpcSitF
 157:     Data        : 16/06/2014
 158:     Autor       : Marinaldo de Jesus ( http://www.blacktdn.com.br )
 159:     Descricao   : Programa para retornar Consulta Padrao "Específica" baseada em f_Opcoes
 160:     Uso         : Consulta F3 (%F3SIT) para as situacoes da Folha de Pagamento
 161:     Sintaxe     : StaticCall(F3F_OPCOES,f3fOpcSitF)
 162: */
 163: Static Function f3fOpcSitF()
 164: Return(f3fOpcSX5("31",1,"31","%F3SIT"))
 165:  
 166: /*
 167:     Programa    : f3f_Opcoes
 168:     Funcao      : f3fOpcCatF
 169:     Data        : 16/06/2014
 170:     Autor       : Marinaldo de Jesus ( http://www.blacktdn.com.br )
 171:     Descricao   : Programa para retornar Consulta Padrao "Específica" baseada em f_Opcoes
 172:     Uso         : Consulta F3 (%F3CAT) para as Categoria da Folha de Pagamento
 173:     Sintaxe     : StaticCall(F3F_OPCOES,f3fOpcCatF)
 174: */
 175: Static Function f3fOpcCatF()
 176: Return(f3fOpcSX5("28",1,"28","%F3CAT"))
 177:  
 178: /*
 179:     Programa    : f3f_Opcoes
 180:     Funcao      : f3fOpcRetD
 181:     Data        : 10/06/2014
 182:     Autor       : Marinaldo de Jesus
 183:     Descricao   : Retornar a ultima opção selecionada na Contulda Customizada
 184:     Uso         : Retorno da Consulta F3
 185:     Sintaxe     : StaticCall(F3F_OPCOES,f3fOpcRetD,cF3Name)
 186: */
 187: Static Function f3fOpcRetD(cF3Name)
 188:     Local uF3Ret
 189:     Local nF3Ret
 190:     IF(__aF3Ret==NIL)
 191:         __aF3Ret := Array(0)
 192:     EndIF   
 193:     nF3Ret := aScan(__aF3Ret,{|e|e[1]==cF3Name})
 194:     IF (nF3Ret>0)
 195:         cF3Ret    := __aF3Ret[nF3Ret][2]
 196:         aSize(aDel(__aF3Ret,nF3Ret),Len(__aF3Ret)-1)
 197:     Else
 198:         uF3Ret    := &(ReadVar())
 199:     EndIF
 200: Return(uF3Ret)

 







Incluindo a Consulta Padrão (%F3SIT)













Incluindo a Consulta Específica:       %F3SIT


Incluindo a Consulta Específica:       %F3CAT
image image
image image
image image
image image



























Alterando as Perguntas Grupo GPR040 : Situacoes a Imp. ?Alterando as Perguntas Grupo GPR040: Caregorias a Imp. ?
image image
image image
image image
image image
image image




















Utilizando a Consulta Específica: %F3SITUtilizando a Consulta Específica: %F3CAT
image image
image image




O código poderá ser obitido aqui.

[]s
иαldσ dj

Comentários

Postagens mais visitadas