接続プールkerberos権限認証のimpala+kuduデータベースへの接続

5681 ワード

何も言わないで、まずツッコミを入れて、ツッコミ技術センター、ツッコミ部門、私に安全に使うことができますか?接続プールを介してkerberos認証が存在するimpala+kuduデータベースに接続することを書きます.
まずkerberosとは何ですか.
Kerberosサービスは、ネットワーク上で安全なトランザクションを提供するクライアント/サーバアーキテクチャです.このサービスは、強力なユーザー検証と完全性と機密性を提供します.検証により、ネットワークトランザクションの送信者と受信者のアイデンティティが真実であることが保証されます.このサービスはまた、往復伝達されるデータの有効性(完全性)を検証し、伝送中にデータを暗号化(機密性)することもできる.Kerberosサービスを使用すると、他のコンピュータに安全にログインしたり、コマンドを実行したり、データを交換したり、ファイルを転送したりすることができます.また、管理者がサービスとコンピュータへのアクセスを制限できるように、認証サービスも提供します.また、Kerberosユーザーとして、他のユーザーのアカウントへのアクセスを制御することもできます.
解決方法と方法:
その时、まずネット上で资料を探して、ネット上でプールに接続していないことを発见して、JDBCを通じて直接接続するだけで、コードは以下の通りです:
public class App4 {
    public static void main(String[] args) throws ClassNotFoundException {
        String driverName="org.apache.hive.jdbc.HiveDriver";
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        String url = "jdbc:hive2://135.12.70.35:21055/;principal=impala/[email protected]";
        
        Configuration conf = new Configuration();
        conf.set("hadoop.security.authentication", "Kerberos");
        try {
            System.setProperty("java.security.krb5.conf", "resource/krb5.conf");
            UserGroupInformation.setConfiguration(conf);
            UserGroupInformation.loginUserFromKeytab("impala/[email protected]", "resource/impala.haproxy.keytab");
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            Class.forName(driverName);
            Connection conn = DriverManager.getConnection(url);
            Statement stmt = conn.createStatement();
            String sql = "select * from test1";
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getInt(1));
            }
            stmt.close();
            rs.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上を通じて発見して、どのように、接続する前に先に検証して、しかし接続プールのinit方法はまったく私が書く必要はありませんて、これはどのようにして、この時私の思惟は誤区に入って、接続プールのソースコードを修正する必要があるかどうかを考えて、だから私はクラスを書いてDruidDataSourceを継承して、init方法を書き直してこの上でkerberos検証を加えて、しかしこの方法は実現することができて、実はとても間違って、これは、従来のデータベースの影響を受けている可能性があります.接続を確立するたびに検証しなければならないと思っていましたが、kerberosは単一のログインで、サーバ間の通信でした.その後、リーダーの指導の下で、listenerを採用してプロジェクトの起動時に、プロジェクトの起動時に検証しました.リスナーは以下のようにしています.
public class GetConnListener implements ServletContextListener{
	private static Logger log = LoggerFactory.getLogger(GetConnListener.class) ;
	private static final  Configuration kuduconf = new Configuration();
	public static void initkerberos() throws IOException
	{
		 File directory = new File("");//     
	     String courseFile = directory.getCanonicalPath();
		 Configuration	conf = getKuduConf();
	     try {
	            System.setProperty("java.security.krb5.conf", courseFile+"/WebRoot/krb5.conf");
	            UserGroupInformation.setConfiguration(conf);
	            UserGroupInformation.loginUserFromKeytab("[email protected]", courseFile+"/WebRoot/impala.haproxy.keytab");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	       log.info("Kerberos    ") ;
	}
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		try {
			initkerberos();
		} catch (IOException e) {
			e.printStackTrace();
		}
		log.info("Kerberos     ") ;
	}
	public static Configuration getKuduConf(){
		kuduconf.set("hadoop.security.authentication", "Kerberos");
		return kuduconf;
	}
}

注意すべきはリスナーの順序で、認証されたこのリスナーは一番上に置かれています.以下のようにします.
	
     			sjgl.system.GetConnListener
  	
	
	
		org.springframework.web.context.ContextLoaderListener
	

しかし、私はkerberosが24時間失効したように見えて、それから定時任務を書いてタイムリーに認証しましたが、一度認証を繰り返す必要はありません.彼は自分で更新して、私も管理していません.保険のため、スケジュールは以下の通りです.
@Service
public class reloadkbs {
	private static Logger log = LoggerFactory.getLogger(reloadkbs.class) ;
	@Scheduled(fixedRate = 1000*60*60*23)  
	public void reloadkerberos() throws IOException{
		GetConnListener.initkerberos();
		log.info("Kerberos      ") ;
	}
}

ただし、接続プールの使用中に接続プールの問題が発生したこともあります.たとえば、接続プールが1日おきに切断され、サービスが正常に再開されます.エラーメッセージ:[Request processing failed;nested exception is org.hibernate.exception.GenericJDBCEXception:could not inspect JDBC autocommit mode]with root cause
java.net.SocketException: Software caused connection abort: socket write error
druidの例に従って最小接続数を構成し、接続が開いていることを検出しましたが、役に立ちませんか?すみません、druidの接続プールの最小接続を保つ検出ログ出力をどう思いますか??接続が検出されているかどうか見てみます.
ソリューション:まずwait_を変更します.timeoutはよくない.
次の構成で解決します.

  
  
  
  

testWhileIdle:パフォーマンスに影響を及ぼさず、セキュリティを確保するためにtrueとして構成することを推奨します.接続を申請するときに検出され、空き時間がより大きい場合
timeBetweenEveictionRunsMillisは、validationQueryを実行して接続が有効かどうかを検出します.
testOnBorrow:接続申請時にvalidationQueryを実行して接続が有効かどうかを検出し、この構成をするとパフォーマンスが低下します.
testOnReturn:接続を返すときにvalidationQueryを実行して接続が有効かどうかを検出し、この構成をするとパフォーマンスが低下します
 
また、七夕おめでとうございます.今年の七夕は私一人です.