자바 의 jvm 학습 노트 10 (전략 및 보호 영역)
앞에서 우 리 는 간단 한 실험 을 해서 전략 파일 이 무엇 인지 설명 했다. 문장의 마지막 부분 에서 전략 이 무엇 인지, 그리고 전략의 역할 도 덧 붙 였 다.
또 다른 중요 한 개념 인 Protection Domain (보호 역) 을 끌 어 내기 위해 서 는 전략 이 무엇 인지 살 펴 봐 야 한다.
우선, 전략 이 무엇 인지, 오늘 의 것 은 순 전 히 비교 개념 이다.물론 노트 9, 오늘 의 것 을 읽 었 다 면 정말 so 입 니 다.
정책 및 정책 파일:
자바 가 응용 프로그램 에 대한 접근 제어 전략 은 추상 적 인 자바 security. Policy 의 키 클래스 의 단일 예 로 표시 되 며, 모든 응용 프로그램 은 실제 적 으로 하나의 Policy 대상 만 있 고, Policy 대상 은 정책 파일 에 대응 합 니 다.클래스 로 더 는 이 Policy 대상 을 이용 하여 코드 를 가상 컴퓨터 로 가 져 올 때 어떤 권한 을 부여 해 야 할 지 결정 하 는 데 도움 을 줍 니 다.
위의 말 은 프로그램 이 정책 대상 에 대응 하고 정책 대상 이 정책 파일 에 대응 하 는 것 을 알려 줍 니 다.
그렇다면 정책 파일 은 9 개의 폴 더 에 있 는 모든 파일 을 필기 하 는 것 외 에 어떤 주체 에 게 도 작용 할 수 있 습 니까?다음 정책 파일 my Policy. txt 부터 보 겠 습 니 다.
keystore "ijvmkeys";
grant signedby "friend" {
permission java.io.FilePermission "d:/testPolicy.txt", "read,write";
};
grant signedby "stranger" {
permission java.io.FilePermission "d:/testPolicy.txt", "read,write";
};
grant codeBase "file:D:/workspace/TestPolicy/bin/*" {
permission java.io.FilePermission "d:/testPolicy.txt", "read,write";
};
간단하게 해석 해 주세요.
첫 번 째 줄: keystore "ijvmkeys" 라 는 줄 의 뜻 입 니 다. 키 쌍 은 현재 디 렉 터 리 에 있 는 ijvmkeys 라 는 파일 에 저 장 됩 니 다. (메모 8 에서 했 던 jar 패키지 서명 실험 을 기억 하 십 니까?)
두 번 째 줄: grant signedby "friend", grant 는 권한 을 부여 한 다 는 뜻 입 니 다. 이 줄 은 "friend" 키 에 서명 한 파일 에 권한 을 부여 한 다 는 뜻 입 니 다.
세 번 째 줄: permission java. io. FilePermission "d: / testPolicy. txt", "read, write";이 줄 은 d: / test Policy. txt 에 읽 기와 쓰기 권한 을 부여 한 다 는 뜻 입 니 다.
마지막 세 번 째 줄: grant codeBase "file: D: / workspace / TestPolicy / bin / *" 라 는 말 을 우리 가 9 를 필기 할 때 본 적 이 있 는데, 바로 D: / workspace / TestPolicy / bin / * 의 모든 파일 에 권한 을 부여 하 는 것 이다.
중점 1: 여기 서 전략 파일 은 일련의 서 명 된 코드 라 이브 러 리 ("friend", "stranger" 는 모두 코드 라 이브 러 리) 에 권한 을 부여 할 수 있 고 코드 원본 (구체 적 인 경로 또는 url 은 코드 원본) 에 권한 을 부여 할 수 있다 는 것 을 알 수 있 습 니 다.
중점 2: 정책 파일 은 파일 에 저장 할 수 있 을 뿐만 아니 라 데이터베이스 에 저장 할 수 있 습 니 다.
여기까지 와 서 우 리 는 전략 에 대해 비교적 완전한 개념 을 가지 게 되 었 습 니 다. 그러나 당신 은 이런 의문 이 있 습 니까? 앞에서 우 리 는 항상 한 응용 프로그램 이 하나의 전략 사례 에 대응 하고 하나의 전략 사례 가 하나의 전략 파일 에 대응 하 는데 그것 이 도대체 어떻게 대응 하 는 지 연구 해 보 겠 습 니 다.
탐구 하기 전에 우 리 는 보호 역 (Protection Domain) 이라는 새로운 개념 을 도입 했다. 필기 3 에서 클래스 로 더 가 class 파일 load 메모 리 를 보호 역 에 놓 을 때 보호 역 이 무엇 인지 말 한 적 이 있다.
보호 역 이란 무엇 인가
클래스 로 더 가 자바 가상 머 신 에 형식 을 불 러 올 때, 각각 보호 영역 을 지정 합 니 다. 보호 영역 은 특정 코드 에 대한 모든 권한 을 부여 합 니 다.
클래스 로 더 는 모든 클래스 나 인터페이스의 코드 라 이브 러 리 와 서명 자 를 알 고 있 습 니 다. 이 정 보 를 이용 하여 CodeSource 대상 을 만 듭 니 다. 이 CodeSource 대상 을 현재 Policy 대상 의 getPermissions () 에 전달 합 니 다.방법, 이 추상 적 인 클래스 java. security. PermissionCollection 의 하위 클래스 인 스 턴 스 를 얻 습 니 다. 이 PermissinCollection 은 모든 Permission 대상 에 대한 참조 (이 Permission 대상 은 현재 정책 에서 지정 한 코드 원본 을 부여 합 니 다) 를 포함 합 니 다.. CodeSource 와 Policy 대상 을 대상 으로 하 는 Permission Collection 을 이용 하여 새로운 ProtectDomain 대상 을 예화 할 수 있 습 니 다. 적절 한 Protection Domain 대상 을 defineClass () 방법 으로 이 코드 를 보호 영역 에 전달 합 니 다.
만약 당신 이 위의 이 말 을 이해 하지 못 한다 면 아래 의 이 그림 을 보 세 요.
자, 위의 이 모든 과정 을 보고 보호 역 이 무엇 인지 이해 하 셨 습 니까?
다음은 오늘 의 내용 을 다시 정리 하 겠 습 니 다. 개념 이 좀 많 고 하나씩 하 겠 습 니 다.
codeSource: 코드 원본, 이것 은 클래스 로 더 에서 생 성 된 자바 security. CodeSource 의 대상 입 니 다. classLoader 는 class 파일 을 읽 고 jar 가방 은 누가 이 클래스 에 서명 한 적 이 있 는 지 알 수 있 습 니 다.(로 컬 url 또는 네트워크 에서 온 ur 일 수 있 습 니 다. grant 노트 9 리 my Pollicy 의 "friend" 또는 file::................................................(일반적으로 하나의 jar 는 여러 단체 나 기구 에 의 해 담보 되 는 것 입 니 다. 즉, 우리 가 말 하 는 인증 입 니 다. 자바 1.2 의 기본 보안 관리자 와 액세스 제어 시스템 구 조 는 인증서 에 만 작용 할 수 있 고 적나라한 공개 키 에 작용 할 수 없습니다. 실제로 우 리 는 키 쌍 을 키 tool 로 생 성 할 때 자체 서명 인증 서 를 생 성 합 니 다. 그래서 키 tool 이 생 성 한 키 쌍 은적나라한 것 이 아 닙 니 다). 궁금 한 점 이 있 으 면 jdk 의 코드 를 보 겠 습 니 다.
public class CodeSource implements java.io.Serializable {
private static final long serialVersionUID = 4977541819976013951L;
/**
* The code location.
*
* @serial
*/
private URL location;//
/*
* The code signers.
*/
private transient CodeSigner[] signers = null;//
/*
* The code signers. Certificate chains are concatenated.
*/
private transient java.security.cert.Certificate certs[] = null;//
Policy: 정책 은 정책 파일 을 읽 기 위 한 단일 대상 입 니 다. 들 어 오 는 CodeSource 대상 (codeSource 대상 에 서명 자 와 코드 원본 이 포함 되 어 있 기 때문에) 을 통 해 grant 세그먼트 를 읽 고 Perssiom 을 꺼 내 Perssiom Collection 으로 돌아 갑 니 다. 이 클래스 에는 중요 한 구성원 변수 가 있 습 니 다.
// Cache mapping ProtectionDomain to PermissionCollection
private WeakHashMap pdMapping;
이 멤버 가 왜 중요 한 지 방법 을 알 아 보 겠 습 니 다.
private static void initPolicy (final Policy p) {
......
if (policyDomain.getCodeSource() != null) {
.......
synchronized (p.pdMapping) {
// cache of pd to permissions
p.pdMapping.put(policyDomain, policyPerms);
}
}
return;
}
우 리 는 주로 핵심 코드 를 봅 니 다. 이 pdMapping 은 보호 도 메 인 대상 을 key 로 삼 아 권한 집합 을 value 로 이 map 에 존재 합 니 다. 그래서 보호 도 메 인 이 여러 정책 파일 에 대응 하 는 grant 자구 의 permission 을 말 합 니 다.
Protection Domain: 보호 도 메 인, 앞에서 우리 가 소 개 했 습 니 다. 그 는 class 파일 을 수용 하 는 데 사 용 됩 니 다. 그리고 perssiom, codeSource 의 대상 도 있 습 니 다. 만약 에 이것 에 대해 의문 이 있다 면 우리 도 그 코드 를 보고 우리 의 결론 을 검증 하 겠 습 니 다.
public class ProtectionDomain {
/* CodeSource */
private CodeSource codesource ;//
/* ClassLoader the protection domain was consed from */
private ClassLoader classloader;//
/* Principals running-as within this protection domain */
private Principal[] principals;
/* the rights this protection domain is granted */
private PermissionCollection permissions;//
Permission: 권한, 이것 은 우리 가 9 리 의 grant 자구 에 있 는 permission 에 대응 합 니 다. 그 구조 도 간단 합 니 다. 권한 이름과 동작 은 마치 우리 가 9 리 의 자바. io. FilePermission 을 필기 하 는 것 과 같 습 니 다.
동작 은 read 와 write 로 Permission 에서 문자열 에 대응 합 니 다.
지금 우 리 는 그림 한 장 으로 위의 몇 가지 개념 을 연결 시 켰 다.
여기까지 우 리 는 이미 비교적 완전한 사고방식 을 가지 고 있다. 노트 4 부터 이 절의 노트 10 까지 우리 가 말 하고 자 하 는 것 은 모두 한 가지 뿐이다. 클래스 적재 기 가 클래스 를 적재 할 때 (또는 실행 클래스)안전 관리자, 안전 관리 자 를 호출 할 수 있 습 니 다. 판단 전략 을 통 해 우리 가 이런 종 류 를 불 러 올 수 있 는 지, 아니면 어떤 조작 을 수행 할 수 있 는 지, 어떤 파일 의 읽 기와 쓰 기 를 허용 하 는 지 판단 합 니 다. (이것 은 필기 9 시 에 우 리 는 이미 실험 을 했 습 니 다)... 그렇다면 안전 관리자 가 어떻게 전략 을 호출 하 는 지 의문 이 있 습 니까? 여기 서 우 리 는 새로운 개념 으로 컨트롤 러 Access Control 을 방문 해 야 합 니 다. 컨트롤 러 가 무엇 을 하 는 지, 어떤 일 을 하 는 지, 어떻게 안전 관리 와 합작 하 는 지 알 고 싶다 면 다음 절 을 읽 어 보 세 요.
writed by:keycoding
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.