자바 보안 샌 드 박스 (4) 의 보안 관리자 및 자바 API
9046 단어 api자바 안전 샌 드 박스보안 관리자 및 자바
이 블 로 그 는 주로 '클래스 보안 관리자 및 자바 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"];
… …
};
다음은 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 소개 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기상청 API를 사용한 비오는 날만 알려주는 LINE Notify 작성지금까지 기상청의 기상 데이터는 스크래핑을 하는 것으로 밖에 얻을 수 없었습니다만, 1개월 정도 전에 기상청 HP가 API화했다(엄밀한 API가 아닌 것 같다)라고 하는 것으로 조속히 사용해 가려고 생각합니다. 이번...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.