자바 보안 샌 드 박스 (4) 의 보안 관리자 및 자바 API

자바 는 유형의 안전 한 언어 로 네 가지 안전 샌 드 박스 체제 라 고 불 리 는 안전 메커니즘 으로 언어의 안전성 을 확보 합 니 다. 이 네 가지 안전 샌 드 박스 는 각각 다음 과 같 습 니 다.
  • 클래스 로드 시스템
  • . class 파일 검사 기
  • 자바 가상 컴퓨터 (및 언어) 에 내 장 된 보안 특성
  • 얼마나
    이 블 로 그 는 주로 '클래스 보안 관리자 및 자바 API' 의 기본 원 리 를 소개 합 니 다. 다른 몇 가지 보안 체 제 를 알 고 싶 으 면 위의 블 로그 링크 를 통 해 볼 수 있 습 니 다.
    간단 한 소개
    자바 보안 샌 드 박스 의 세 가지 유형 은 jvm 이 실행 하 는 프로그램의 완전 성 을 확보 하여 jvm 이 구멍 이나 악성 코드 를 실행 해서 예상 치 못 한 상태 가 발생 하지 않도록 합 니 다.네 번 째 샌 드 박스 모델 은 '클래스 보안 관리자 및 자바 API' 로 jvm 이 실행 에 구멍 이 있 거나 악성 코드 가 외부 자원 을 파괴 하지 않도록 보호 할 수 있다.자바 는 보안 관리자 라 고 불 리 는 API 를 통 해 이러한 안전성 을 확보 합 니 다.
    보안 정책 파일
    우선 보안 정책 파일 을 소개 합 니 다. 보안 관리 자 를 사용 하면 기본 값 으로 jre 가 가지 고 있 는 보안 정책 파일 $JAVA 을 사용 합 니 다.HOME / jre / lib / security / java. policy 는 외부 자원 에 접근 할 수 있 는 권한 을 지정 합 니 다. 이 정책 파일 은 jvm 인자 - Djva. security. policy 를 통 해 지정 할 수 있 습 니 다.
    Policy 파일 의 주요 형식 은 다음 과 같 습 니 다.
    keystore "some_keystore_url", "keystore_type";
    grant [SignedBy "signer_names"] [, CodeBase "URL"] {
        Permission permission_class_name ["target_name"] [,"action"] [,SignedBy"signer_names"];
        … …
    };
  • "keystore" 기록 하나의 keystore 는 X. 509 인증서 와 같은 개인 키 (private keys) 데이터베이스 와 해당 하 는 디지털 서명 입 니 다.Policy 파일 에는 keystore 기록 이 하나 밖 에 없 을 수도 있 습 니 다. 파일 에 grant 기록 이외 의 어느 곳 에 도 나타 날 수 있 습 니 다.Policy 설정 파일 에서 지정 한 keystore 는 grant 기록 에서 지정 한 서명 자의 공공 키 (Public keys) 를 찾 는 데 사 용 됩 니 다. grant 기록 이 지정 한 서명 자 (signer names) 를 찾 으 면 keystore 기록 은 policy 설정 파일 에 나타 나 야 합 니 다."some keystore url" 은 keystore 의 URL 위 치 를 가리 키 며, "keystore type" 은 keystore 의 유형 을 가리킨다.두 번 째 옵션 은 옵션 입 니 다. 지정 되 지 않 으 면 보안 속성 파일 (java. security) 의 'keystore. type' 속성 으로 가정 합 니 다.keystore 형식 은 keystore 정보의 저장 과 데이터 형식 을 정의 하여 keystore 의 개인 키 와 keystore 의 완전 성 을 보호 하 는 알고리즘 입 니 다.Sun Microsystems 가 지원 하 는 결 성 유형 은 'JKS' 다.
  • "grant" 가 Policy 파일 에 기 록 된 모든 grant 기록 에는 CodeSource (지정 코드) 와 permission (허가) 가 포함 되 어 있 습 니 다.Policy 파일 의 모든 grant 기록 은 다음 형식 에 따라 'grant' 로 시작 하여 새로운 기록 의 시작 을 표시 합 니 다. 'Permission' 은 다른 보존 글자 로 기록 에 새로운 허가 의 시작 을 표시 합 니 다.모든 grant 기록 은 지정 한 코드 (CodeBase) 에 대한 허 가 를 부여 합 니 다 (Permissions).permission_class_name 은 자바. io. FilePermission 와 같은 합 격 된 모든 한정 적 인 유형 이 어야 합 니 다.target_name 은 대상 클래스 의 위 치 를 지정 하 는 데 사 용 됩 니 다. action 은 대상 클래스 가 가 진 권한 을 지정 하 는 데 사 용 됩 니 다. target_name 은 클래스 이름 (절대 또는 상대 경로 일 수 있 음) 을 직접 지정 할 수 있 고 디 렉 터 리 이름 도 어댑터 /, / * 또는 / - 를 사용 할 수 있 습 니 다.directory / directory 디 렉 터 리 에 있 는 모든. class 파일 을 표시 합 니 다. jar 파일 directory / * 는 포함 되 지 않 습 니 다. directory 디 렉 터 리 에 있 는 모든. class 및. jar 파일 directory / - directory 디 렉 터 리 에 있 는 모든. class 및. jar 파일 을 표시 합 니 다. 하위 디 렉 터 리
  • 를 포함 합 니 다.
    다음은 policy 파일 의 demo 입 니 다.
    grant codeBase "file:${{java.ext.dirs}}/*" {
            permission java.security.AllPermission;
    };
    grant {
            permission java.lang.RuntimePermission "stopThread";
            permission java.net.SocketPermission "localhost:1099", "listen";        
            permission java.util.PropertyPermission "java.version", "read";
            ... ...
    };

    예 를 들 어 자바. net. SocketPermission 에 대해 action 은 listen, accept, connect, read, write 일 수 있 습 니 다.java. io. FilePermission 에 대해 action 은 read, write, delete, execute 일 수 있 습 니 다.
    안전 관리자
    자바 의 안전 관리 자 는 맞 춤 형 으로 설정 할 수 있 고 jdk 의 기본 값 으로 자바. lang. security Manager 를 실현 할 수 있 습 니 다. 안전 관리 자 를 시작 하면 두 가지 방식 이 있 습 니 다. 하 나 는 하 드 인 코딩 으로 시작 하 는 것 이 고 다른 하 나 는 jvm 파라미터 - Djva. security. manager 를 통 해 시작 합 니 다.
    다음 테스트 용례 는 jre 의 기본 policy 파일 설정 을 사용 합 니 다:
    grant {
            ... ...       
            permission java.util.PropertyPermission "java.version", "read";
            ... ...
    };

    이 정책 파일 은 "java. version" 의 읽 기 권한 을 지정 하고 쓰기 권한 을 지정 하지 않 았 습 니 다.다음 테스트 용례 참조:
    public static void main(String... args) {
        String javaVersion=System.getProperty("java.version");
        System.err.println(javaVersion);
        System.setProperty("java.version","1.7.0_45");
        String javaNewVersion=System.getProperty("java.version");
        System.err.println(javaNewVersion);
      }

    먼저 "java. version" 속성 을 읽 고 이 속성 을 1.7.0 로 바 꿉 니 다.45. 마지막 으로 읽 고 출력 합 니 다. 출력 결 과 는 다음 과 같 습 니 다.
    1.8.0_45
    1.7.0_45

    기본 jdk 버 전 1.8.0 을 볼 수 있 습 니 다.45 (1.8.0 은 자바 의 메 인 버 전 번호 이 고 45 는 차 버 전 번호).
    그리고 앞의 policy 파일 은 read 권한 만 지 정 했 는데 왜 여기 write 가 성 공 했 습 니까?그것 은 기본 적 인 상황 에서 자바 가 안전 관리 자 를 시작 하지 않 기 때 문 입 니 다. 하 드 코딩 System. setSecurity Manager () 를 사용 하여 안전 관리 자 를 시작 할 수 있 습 니 다. 다음 테스트 사례 를 참고 하 십시오.
    public static void main(String... args) {
        //        
        System.setSecurityManager(new SecurityManager());
        String javaVersion=System.getProperty("java.version");
        System.err.println(javaVersion);
        System.setProperty("java.version","1.7.0_45");
        String javaNewVersion=System.getProperty("java.version");
        System.err.println(javaNewVersion);
      }

    이 출력 결 과 는 다음 과 같 습 니 다.
    1.8.0_45
    Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.version" "write")
    	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
    	at java.security.AccessController.checkPermission(AccessController.java:884)
    	at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    	at java.lang.System.setProperty(System.java:792)
    	at test.Test.main(Test.java:9)

    결 과 는 명확 합 니 다. 읽 을 수 있 지만 쓸 수 없습니다. policy 파일 을 수정 하여 "java. version" 의 쓰기 동작 을 지원 할 수 있 습 니 다.
    grant {
            ... ...       
            permission java.util.PropertyPermission "java.version", "read";
            permission java.util.PropertyPermission "java.version", "write";
            ... ...
    };

    이 때 위의 용례 를 실행 합 니 다. 출력 결 과 는 다음 과 같 습 니 다.
    1.8.0_45
    1.7.0_45

    이 때 "java. version" 의 쓰기 동작 을 지원 할 수 있 습 니 다.
    또한 jvm 인자 - Djava. security. manager 를 사용 하면 보안 관리 자 를 사용 할 수 있 습 니 다. 이 때 jvm 이 시 작 될 때 "java. security. manager" 시스템 속성 을 빈 문자열 로 설정 합 니 다. "이 때 sun. misc. Launcher 를 시작 할 때 보안 관리 자 를 초기 화하 고 sun. misc. Launcher 의 원본 코드 를 봅 니 다.
    public Launcher(){
            ExtClassLoader extclassloader;
            try {
                extclassloader = ExtClassLoader.getExtClassLoader();
            } catch(IOException ioexception) {
                throw new InternalError("Could not create extension class loader", ioexception);
            }
            try {
                loader = AppClassLoader.getAppClassLoader(extclassloader);
            } catch(IOException ioexception1) {
                throw new InternalError("Could not create application class loader", ioexception1);
            }
            Thread.currentThread().setContextClassLoader(loader);
            String s = System.getProperty("java.security.manager");
            if(s != null) {
                SecurityManager securitymanager = null;
                if("".equals(s) || "default".equals(s))
                    securitymanager = new SecurityManager();
                else
                    try {
                        securitymanager = (SecurityManager)loader.loadClass(s).newInstance();
                    }
                    catch(IllegalAccessException illegalaccessexception) { }
                    catch(InstantiationException instantiationexception) { }
                    catch(ClassNotFoundException classnotfoundexception) { }
                    catch(ClassCastException classcastexception) { }
                if(securitymanager != null)
                    System.setSecurityManager(securitymanager);
                else
                    throw new InternalError((new StringBuilder()).append("Could not create SecurityManager: ").append(s).toString());
            }
        }

    "java. security. manager" 시스템 속성 이 빈 문자열 "인 것 을 볼 수 있 을 때 jdk 의 기본 보안 관리자 Security Manager 를 사용 합 니 다.
    Java API
    자바 의 보안 메커니즘 api 는 대부분 자바. security 패키지 에 있 습 니 다. 소스 코드 가 많 기 때문에 붙 이지 않 습 니 다. 관심 이 있 으 시 면 연구 해 보 세 요.다음은 자주 사용 하 는 api 소개 입 니 다.
  • java. security. AccessControl Context: 봉 인 된 상하 문 을 바탕 으로 시스템 자원 접근 결정 을 내 립 니 다. 이 종 류 는 코드 를 '특권' 으로 표시 하 는 데 가장 많이 사 용 됩 니 다.
  • java. security. AccessController: 접근 제어 와 관련 된 조작 과 결정 에 사 용 됩 니 다.java. security. SecureClassLoader 는 ClassLoader 를 확장 하여 관련 코드 원본 과 권한 정의 클래스 를 지원 합 니 다. 이 코드 원본 과 권한 은 기본적으로 시스템 정책 에 따라 가 져 올 수 있 습 니 다.
  • java. security. Provider: 자바 보안 API "provider" 를 표시 합 니 다. 여기 provider 는 자바 보안 의 일부분 또는 전 부 를 실현 합 니 다.
  • java. security. Permission: 시스템 자원 에 접근 하 는 추상 적 인 클래스 를 표시 합 니 다.모든 권한 에는 하나의 이름 (이들 에 대한 해석 은 하위 클래스 에 의존) 과 특정한 Permission 하위 클래스 의 의 미 를 정의 하 는 추상 적 인 방법 이 있 습 니 다.
  • 좋은 웹페이지 즐겨찾기