같은 여행 여행 Hadoop의 안전 연습
0x01 배경
더 큰 회사는 지금 공유 Hadoop 클러스터 모델을 사용 하.
공유 Hadoop 참조: 데이터 저장, 공공/민간 파일 디렉터리 HDFs, 다른 데이터에 대 한 액세스의 필요 조건에 따라 다른 사용자에 혼합 컴퓨팅 리소스, 관리자 부서 또는 비즈니스 자원의 일정 금액으로 각각 여러 큐를 분할 하 고 각 사용자/그룹 리소스 큐에서 사용할 수 있습니다. 이 모델은 유지 보수 비용 절감, 데이터의 과도 한 중복을 피하기 위해 고 하드웨어 비용을 줄일 수 있습니다. 하지만 클라우드 스토리지/클라우드 컴퓨팅의이 종류를 직면 하는 가장 큰 문제 중 하나는 보안입니다. 동일한 프로세스에서 정보 보안은 각 부서에 침투, 데이터 보안은 가장 중요 하다. 이 기사는 Hadoop 보안에 동일한 여행 큰 데이터 아키텍처 부의 연습을 공유 하고있다.
그러나, Hadoop은 보안의 부족 이다. 가장 중요 한 문제 중 하나는 클라이언트 사용자 이름 및 사용자 그룹 이름의 임의성 이다. Hadoop은 현재 사용자 이름으로 환경 변수에서 hadoop_user_name, 빈, 빈, 고 User.Name 및 Group.name 속성에 추가 합니다 경우 현재 시스템 사용자 이름을 가져옵니다 경우 시스템 매개 변수에서 hadoop_user_name를 걸립니다. 사용자가 Conf.set ("User.Name", 루트), Conf.set ("Group.name", "루트")를 통해 직접 루트로 사용자 이름 및 사용자 그룹을 지정할 수도 있습니다. 클러스터에 제출 요청 하지 자신의 디렉토리에 사용 하는 다른 사람에 게 속하는 컴퓨팅 리소스 파일 읽기 및 쓰기를 루트로 사용할 수 있습니다.
Hadoop 팀 또한 데이터 보안의 부족을 인식 하 고 기관 인증에 대 한 라이센스 메커니즘을 추가 했습니다. 사용자의 로그인 이름은 완전 한 RPC 권한 부여 [2 후 RPC 사용 하 여 단순 인증 및 보안 레이어 (SASL) 결정 (일반적으로 Kerberos 프로토콜을 사용 하는) 권한 프로토콜 RPC 헤더 통해 RPC에 전달 됩니다. ] 。 그러나, 인증 Hadoop 클러스터에는 다음과 같은 문제가 Kerberos를 사용:
1. Kerberos 생성 인증서 및 구성 단계는 매우 복잡 한 디버그 디버깅 또한 모호한, 거기 특정 경험 하기 어렵습니다 시작; 2. 불 쌍 한 연입니다. 확장 및 컴퓨터의 인증서를 다시 생성 하 고 배포 하면 작업 차원에 큰 어려움을 일으키는. 3. 실패의 단일 지점 및 중앙 KDC 허브 서버 호스트 모든 사용자의 키, 그리고 전체 시스템 걸려 마비 될 수 있습니다. 또한 엄격한 시계 동기화를, 그렇지 않으면 인증 실패로 이어질 것입니다 필요 합니다.
위의 이유 뿐만 아니라 그것의 자신의 Hadoop 클러스터의 특성에 따라 (p, T, 수십의 거의 수십의 데이터의 총 부하 상위 레이어 플랫폼/서비스, 수만 수천의 + 데이터 처리/컴퓨팅 작업의 수백에 사용), 보안 메커니즘 Hadoop 의심할 여 지 없이 고속 자동차 바퀴를 변경 하는 추가 0 중단, 중단 없이 롤링 업그레이드 서비스 할 시스템이 필요 합니다. 우리는 독립적으로 개발 경량 Hadoop 사용자 인증 메커니즘.
0x02의 기본 개념
인증의 가장 일반적인 방법은 사용자 이름 및 암호 확인, 우리의 사용 하기 쉬운 요구와 일치 하는 이다. 첫째, 우리는 사용자를 Hadoop와 상호 작용 하기 전에 구성 된 사용자 연결 암호를 읽고 암호를 저장 하 고 확인에 대 한 Hadoop와 상호 작용 하는 모든 요청에 대해 수행 해야 합니다. 또한, 우리는 사용자 것입니다 Namenode와 상호 작용 하는 하 둡으로 아무것도 하기 전에, 블록에 대 한 정보, 파일 읽기 및 임대, 작성 하 고 알아. Namenode 수준에서 사용자 인증을 할 수 있는 생각 하는 것은 있다입니다. 사용자 이름 및 암호에 대 한 매핑 테이블 구성 및 원격 RPC의 형태로 열 로드 될 수 있습니다.
0X03 특정 구현
사용자 부하 암호
사용자 정보는 Hadoop에서 usergroupinformation 클래스로 구현 됩니다. 주제, 비어 있거나 해당 교장 비어 있으면 설명 로그인 하지 않은 경우 Getloginuser () 메서드가 호출 됩니다. LoginContext 먼저, 생성 되 고 로그인 () 메서드가 호출 되 고 완료 후 Login.commit ()가 호출. 우리 읽기 암호 구성 commit () 메서드를 추가 하 고 제목 자격 증명에 저장. 사용자의 홈 디렉터리에 또는 경로에서 암호를 구성할 수 있습니다. 로그인 방법만 처음으로 시작 하는 사용자를 호출 됩니다, 때문에 중복 로드의 문제 피 한다.
Namenode는 매핑 테이블을 로드 하는 사용자 이름 및 암호
Namenode 수 있는 새로운 RPC 서비스 읽기 클러스터 사용자 이름 및 암호 매핑 테이블 추가 했습니다. 현재, Hadoop RPC 호출 대부분 1.0 시대에서 쓰기 가능한 프로토콜의 그것의 자신의 세트를 대체 하는 Google의 PROTOBUF 프로토콜을 채택 했습니다.
프로토콜 파일 Refreshcheckuserpaswordprotocol.proto, RPC 호출에 대 한 요청 및 응답 메시지를 각각 정의 우리는 PROTOBUF 사양에 따라 정의 합니다.
메시지 refreshcheckuserpasswordrequestproto {messagerefreshcheckuserpasswordresponseproto {} 콘텐츠는 비어 있습니다. 정의 하는 매개 변수를 전달 해야 하기 때문에 서비스를 호출 Refreshcheckuserpasswordprotocolservice {Rpcrefreshcheckuserpassword () 반환 합니다 ( Refreshcheckuserpasswordresponseproto); 해당 생성 Protobuf 명령줄 도구를 통해 응답을 요청, 그리고 새로운 프로토콜은 Namenode에서 실행 하기 때문에 서비스의 자바 클래스는 Namenodeprotocols에 등록 되어 Extendsclientprotocol, Datanodeprotocol, Namenodeprotocol, Refreshauthorizationpolicyprotocol, Refreshusermappingsprotocol, Refreshcallqueueprotocol, Genericrefreshprotocol, Getusermappingsprotocol, Namenodeprotocols 구현 클래스 Namenoderpcserver에서에서 호출 하는 Haserviceprotocol, refreshcheckuserpasswordprotocol {} 및 특정 기능을 추가 REFRESHCHECKUSERPASSWORDPROTOCOLSERVERSIDETRANSLATORPB Refreshcheckuserpasswordxlator (); Blockingservice Refreshcheckuserpasswordprotocolservice Newreflectiveblockingservice ( Refreshcheckuserpasswordxlator); 이 서비스를 호출 하는 포털 Dfsadmin 쉘 커맨드 라인에 추가 됩니다 (. cmd)) {Exitcoderefreshcheckuserpassword ();} () throwsioexception {구성 getconf ();. 세트 (CommoNconfigurationkeys.hadoop_security_service_user_name_key,. (Dfsconfigkeys.dfs_namenode_kerberos_principal_를 얻을 키)); Distributedfilesystem Getdfs (); URI GetURI (); Hautil.islogicaluri (,); () {. GetHost (); Listproxyandinforefreshcheckuserpasswordprotocolhautil.getproxiesforallnamenodesinnameservice (, Refreshcheckuserpasswordprotocol입니다.); (Proxyandinforefreshcheckuserpasswordprotocol) {. GetProxy (). Refreshcheckuserpassword (); println (. getaddress ()); } (e) {... println (. getaddress ());. println (E.getmessage ()); } {Refreshcheckuserpasswordprotocolrefreshprotocol Namenodeproxies.createproxy (, Filesystem.getdefaulturi (), Refreshcheckuserpasswordprotocol입니다.)입니다. GetProxy (); Refreshprotocol.refreshcheckuserpassword (); println (); } ; }
마지막으로, 우리 자동으로 사용자 이름 및 암호 (초기화 완료) Namenode의 시작에 매핑 테이블을 로드 합니다.
정확한 위치는 Namenode 클래스 void 초기화 (구성 conf) 던짐의 끝 IOException 메서드
Namenode 클라이언트 인증
Namenode는 사용자 요청을 받으면, usergroupinformation 인스턴스를 사용자의 정보를 Getremoteuser () 메서드를 호출 합니다. 이 시점에서 우리는 사용자 이름, 암호 및 원본 IP 추출의 원조를 요청 하는 매우 자연 스러운, 사용자 인증을 할. 사용자 인증의 논리는 매우 간단 하 고, 사용자 이름, 암호, IP 매핑 테이블의 부팅 중에를 통과, 또는 요청을 가로채 고 오류 던져 조건을 충족, 대비를 찾을 수.
일부 작업은 0x04
새로운 사용자 보안을 달성 하기 위하여 기능 부드러운 온라인, 우리는 다음을 할 몇 가지 추가 기능
글로벌 스위치 사용자 확인
버그에서 새로운 기능을 방지, 한 클릭 스위치 수 있습니다 신속 하 게 새로운 기능을 해제 하 고 빠른 롤백 할.
사용자 허용
사용자 그룹, 수 동시 온라인 전환 불가능 합니다. 우리는 허용 된 사이트 목록에 사용자를 넣어 것입니다, 그리고 일괄 처리 구성/테스트 할당 된 계정 및 암호, 계정의 모든 보안을 달성 하는 단계
인 온라인 프로세스
1. 패키지 Hadoop 공통 및 Hadoop hdfs 공학 다시 컴파일하여
2. 재 부 팅 하는 Namenode와 Datanode 및 스크롤에 해당 jar 팩을 교체 합니다. 보안 기능은 기본적으로 해제 되어, 때문에 새 버전의 jar 패키지와 항아리의 오래 된 버전은 서로 호환 됩니다.
3. 각 노드, 프로젝트 구성 및 사용자 이름 및 암호를 사용자 이름 및 암호를 명령을 통해 테이블을 매핑 로드 Namenode에
4. 보안 구성 하는 키
현재, Hadoop 보안 서비스 중단 또는 다운 그레이드 없이 성공적으로 온라인, 업그레이드 프로세스, 비즈니스 0 지 각을 할. 몇 달 동안 실행 매우 부드러운, 좋은 성능 이기도합니다.