2015-06-04 69 views
0

我在寫一個SNMP v3陷阱/通知使用snmp4j進行身份驗證的發件人,但我很驚訝即使存在身份驗證失敗也能正確確認通知。我還使用snmp4j開發了陷阱接收器來幫助我進行調試。無法通過snmp4j正確使用SNMP身份驗證

我注意到一些意想不到的情況:

1日的情況:發送含有認證/ NoPriv的INFORM,未知的用戶名或密碼錯誤=>的INFORM不承認,但只是沒有反應,發件人必須等待超時。然而,在接收端,AuthenticationFailureEvent被觸發,但我會預料到snmp4j會向發件人迴應一些錯誤。重寫方法processPdu未被調用。我想這可能取決於接收器的實現,或者有一個標準的行爲呢?

第二場景:發送與現有的用戶名但沒有密碼(用NOAUTH/NoPriv)的INFORM,而它與接收器上的=>的INFORM被確認與響應,而沒有任何錯誤,我的阱配置密碼接收者甚至不會像應該那樣觸發AuthenticationFailureEvent。 我希望接收者拒絕請求,如果它是未經驗證的。我忘了初始化什麼?我無法想象在snmp4j中有這樣的安全漏洞。

我使用的初始化接收器的代碼:(我也不在這裏展示重載方法processPdu有authenticationFailure

EmbeddedSNMPReceiver(final int port, final Optional<UsmUser> user) throws IOException { 
    final MessageDispatcherImpl dispatcher = new MessageDispatcherImpl(); 
    dispatcher.addAuthenticationFailureListener(this); 
    final UdpAddress listenAddress = new UdpAddress("localhost/" + port); 
    final TransportMapping transport = new DefaultUdpTransportMapping(listenAddress); 
    SecurityProtocols.getInstance().addDefaultProtocols(); 
    final USM usm = new USM(SecurityProtocols.getInstance(), new OctetString("RECEIVER"), 0); 
    snmp = new Snmp(dispatcher, transport); 

    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); 
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); 
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm)); 
    SecurityModels.getInstance().addSecurityModel(usm); 
    if (user.isPresent()) { 
     snmp.getUSM().addUser(user.get().getSecurityName(), user.get()); 
    } 

    snmp.addCommandResponder(this); 
    snmp.listen(); 
} 

public static void main(String[] args) { 
    // FOR DEBUG 
    try { 
     final OctetString octUsername = new OctetString("zaza"); 
     final OID userAuthOID = AuthSHA.ID; 
     final OctetString octUserPassphrase = new OctetString("12345678"); 
     final UsmUser user = new UsmUser(octUsername, userAuthOID, octUserPassphrase, null, null); 
     final EmbeddedSNMPReceiver server = new EmbeddedSNMPReceiver(1099, Optional.of(user)); 
     Thread.sleep(500000); 
     server.stop(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

PS:爲了澄清,我開始接收器在一個單獨的進程比發件人以避免與snmp4j有狀態/單身問題...

回答

0

你可能會仔細閱讀RFC 3414第4節,看看你是否實際上擊中了發現過程的期望行爲。

1st應該不承認,它遵循v1和v2c約定。

如果回覆消息是REPORT,則預計爲第二個。

+0

(抱歉,延遲迴復);所以,第一意味着我無法知道有認證問題?第二個似乎是與我有關的發現問題,但我認爲所有的發現過程都是透明地由snmp4j處理的。感謝您指出 – Joel

+0

@Joel是的,沒辦法知道客戶端是否存在身份驗證問題。 –

相關問題