2016-01-19 13 views
7

Sto utilizzando SNMP4j per scrivere un agente in java e sta procedendo bene. Posso ottenere e impostare valori (solo SNMPv1 per ora, ma v3 sta arrivando).Errore accesso accesso log SNMP4j incorporato e successo

Il mio prossimo requisito è quello di accedere nel mio registro applicazioni (non il registro SNMP4J) in particolare queste tre cose:

  1. nuovo utente loggato da
  2. Nuova riuscito tentativo di connessione SNMP dall'utente da
  3. SET SNMP utilizzato per scrivere valori da.

Ho utilizzato org.snmp4j.log.LogAdapter per reindirizzare la registrazione SNMP4j nel mio registro di debug, ma non è la registrazione specifica che desidero.

Ho giocato con org.snmp4j.event.AuthenticationFailureListener per registrare quando si verifica un errore di autenticazione. Questo sembra essere solo SNMPv3 e non mi dà il nome utente fallito.

Qualcuno sa come fare? l'architettura dell'ascoltatore sembra essere in parte in posizione, c'è di più in ciò che non riesco a trovare? Potrei usare il codice sorgente e aggiungere la mia registrazione laddove necessario, ma quali sono le implicazioni della licenza? SNMP utilizza Apache 2.0 licenza

risposta

1

ho fatto quanto segue per avere pieno accesso alle richiesta e di risposta PDU:

per il fallimento registrazione di autenticazione :

  1. Estendere il AuthenticationFailureEvent.class. Nel mio caso ho aggiunto il nome di sicurezza e le informazioni sullo stato al costruttore della classe di eventi.
  2. Estendere il MessageDispatcherImpl.class e l'override del metodo dispatchMessage():

    switch (status) { 
        case SnmpConstants.SNMP_MP_UNSUPPORTED_SECURITY_MODEL : 
        case SnmpConstants.SNMPv3_USM_AUTHENTICATION_FAILURE : 
        case SnmpConstants.SNMPv3_USM_UNSUPPORTED_SECURITY_LEVEL : 
        case SnmpConstants.SNMPv3_USM_UNKNOWN_SECURITY_NAME : 
        case SnmpConstants.SNMPv3_USM_AUTHENTICATION_ERROR : 
        case SnmpConstants.SNMPv3_USM_NOT_IN_TIME_WINDOW : 
        case SnmpConstants.SNMPv3_USM_UNSUPPORTED_AUTHPROTOCOL : 
        case SnmpConstants.SNMPv3_USM_UNKNOWN_ENGINEID : 
        case SnmpConstants.SNMP_MP_WRONG_USER_NAME : 
        case SnmpConstants.SNMPv3_TSM_INADEQUATE_SECURITY_LEVELS : 
        case SnmpConstants.SNMP_MP_USM_ERROR : { 
        // create an extended version of the failure event 
        AuthenticationFailureEvent event = new ExtendedAuthenticationFailureEvent(this,incomingAddress,securityName.getValue(),sourceTransport, status, statusInfo, wholeMessage); 
        fireAuthenticationFailure(event); 
        break; 
        } 
    } 
    
  3. Nella classe agente di sovrascrivere il metodo initMessageDispatcher():

    protected void initMessageDispatcher() { 
        ... 
        dispatcher = new ExtendedMessageDispatcherImpl(); 
        ... 
    } 
    
  4. Aggiungi la tua classe di registrazione come ascoltatore a questo dispatcher (ad esempio nel metodo finishInit() del tuo agente):

    dispatcher.addAuthenticationFailureListener(loggingHandler); 
    

Per la richiesta registrazione:

Basta implementare l'interfaccia CommandResponder nella classe di registrazione e aggiungerlo alla sessione:

getSession().addCommandResponder(loggingHandler); 

Per la risposta registrazione:

  1. Crea un me per esempio logResponsePdu(PDU pdu) nella classe di registrazione.

  2. Estendere MessageDispatcherImpl.class e sovrascrivere il metodo returnResponsePdu().

    public int returnResponsePdu(int messageProcessingModel, int securityModel, byte[] securityName, int securityLevel, PDU pdu, int maxSizeResponseScopedPDU, StateReference stateReference, StatusInformation statusInformation) throws MessageException { 
        int result = super.returnResponsePdu(messageProcessingModel, securityModel, securityName, securityLevel, pdu, maxSizeResponseScopedPDU, stateReference, statusInformation); 
        // log response message 
        loggingHandler.logResponsePdu(pdu); 
        return result; 
    } 
    

Il risultato nel mio caso sta registrando in forma di:

richiesta ricevuta! Da: (ip rimosso), nome della sicurezza: (nome di login), PDU tipo: SET, OID: 1.3.6.1.2.1.1.5.0 = 'Nome Test'

Richiesta PDU: SET [{ContextEngineID = (i dati rimossi), contextName = privato}, requestID = (dati rimossi), ErrorStatus = 0, ErrorIndex = 0, VBS [1.3.6.1.2.1.1.5.0 = Nome del test]] mandò

di risposta! Stato errore: Operazione riuscita, tipo PDU: RISPOSTA, OID: 1.3.6.1.2.1.1.5.0 = 'Nome test'

Risposta PDU! PDU: RESPONSE [{contextEngineID = (dati rimossi), contextName = private}, requestID = (dati rimossi), errorStatus = 0, errorIndex = 0, VBS [1.3.6.1.2.1.1.5.0 = Nome test] ]

Forse non è il modo migliore per farlo, ma funziona. Spero di poterti aiutare con questo.

+0

Cool, questo sembra funzionare! Ho fatto funzionare il bit AuthFailure in ogni caso, ora per implementare gli altri. – Jon

+0

Ho questo lavoro ora. Sto vedendo un utente misterioso 'iniziale' comparire nei miei log. Hai visto tutto questo? Immagino che sia SNMP4j a fare qualcosa, o il mio browser MIB potrebbe usarlo. – Jon

+1

No, non ho quell'utente. Forse controlla l'indirizzo del mittente. – Blakhar

Problemi correlati