보안 가드
보안 가드 (Security Guards)
보안 가드는 스레드가 파일, 디렉터리, 네트워크 연결 등에 접근할 때 호출되는 접근 확인 프로시저 묶음이에요. make-security-guard로 만들고, current-security-guard 파라미터로 현재 가드를 지정해요.
출처: Racket Reference
본문
14.6 보안 가드
procedure
(security-guard? v) → boolean?
v : any/c
v가 make-security-guard로 만들어진 보안 가드 값이면 #t를, 그렇지 않으면 #f를 반환해요.
보안 가드는 스레드가 기본(primitive) 프로시저를 통해 파일, 디렉터리, 네트워크 연결에 대한 접근을 시작할 때 호출될 접근 확인 프로시저 묶음을 제공해요. 예를 들어 스레드가 open-input-file을 호출하면, 그 스레드의 현재 보안 가드를 조회하여 스레드가 그 파일에 대한 읽기 접근이 허용되는지 확인해요. 접근이 허용되면 스레드는 보안 가드가 바뀌어도 무기한 사용할 수 있는 포트를 받아요(단, 포트의 큐스토디언이 포트를 종료시킬 수는 있어요; 큐스토디언(Custodians) 참고).
스레드의 현재 보안 가드는 current-security-guard 파라미터로 결정돼요. 모든 보안 가드에는 부모가 있고, 자식의 접근 프로시저가 호출될 때마다 부모의 접근 프로시저도 호출돼요. 따라서 스레드는 새 가드를 설치해 자기 접근 권한을 임의로 늘릴 수 없어요. 초기 보안 가드는 호스트 플랫폼이 강제하는 것 외에는 어떤 접근 제한도 강제하지 않아요.
procedure
(make-security-guard parent
file-guard
network-guard
[link-guard]) → security-guard?
parent : security-guard?
file-guard :
(symbol?
(or/c path? #f)
(listof symbol?)
. -> . any)
network-guard :
(symbol?
(or/c (and/c string? immutable?) #f)
(or/c (integer-in 1 65535) #f)
(or/c 'server 'client)
. -> . any)
link-guard : (or/c (symbol? path? path? . -> . any) #f) = #f
parent의 자식으로 새 보안 가드를 만들어요.
file-guard 프로시저는 세 개의 인자를 받아야 해요.
- 접근 확인을 촉발한 기본 프로시저를 나타내는 심볼 — 접근을 거부하기 위해 예외를 발생시킬 때 유용해요.
- 경로(Paths 참고) 또는
#f—(current-directory),(filesystem-root-list),(find-system-path symbol)같은 경로 없는 조회의 경우#f예요.file-guard에 주어진 경로는 접근을 확인하기 전에 확장되거나 정규화되지 않아요. 예를 들어 상대 경로일 수도 있어요. - 다음 심볼을 하나 이상 담은 리스트:
'read— 파일이나 디렉터리 읽기'write— 파일이나 디렉터리 수정 또는 생성'execute— 파일 실행'delete— 파일이나 디렉터리 삭제'exists— 파일이나 디렉터리가 존재하는지, 또는 경로 문자열이 잘 형성되었는지 확인
'exists 심볼은 file-guard의 마지막 인자에서 다른 심볼과 결합되지 않지만, 그 외의 조합은 모두 가능해요. file-guard의 두 번째 인자가 #f이면, 마지막 인자는 항상 'exists만 담아요.
network-guard 프로시저는 네 개의 인자를 받아야 해요.
- 접근 확인을 촉발한 기본 연산을 나타내는 심볼 — 접근을 거부하기 위해 예외를 발생시킬 때 유용해요.
- 클라이언트 연결의 대상 호스트명 또는 리스닝 서버의 수락 호스트명을 나타내는 불변 문자열; 호스트의 모든 주소에서 연결을 수락하는 리스닝 서버나 UDP 소켓의 경우
#f; 바인딩되지 않은 UDP 소켓의 경우에도#f. 1과65535(포함) 사이의 정확한(exact) 정수로 나타내는 포트 번호, 또는 바인딩되지 않은 UDP 소켓의 경우#f. 클라이언트 연결의 경우 포트 번호는 서버의 대상 포트예요. 리스닝 서버의 경우 포트 번호는 로컬 포트 번호예요.'client또는'server심볼 — 확인이 클라이언트 연결 생성인지 리스닝 서버 생성인지를 나타내요. 바인딩되지 않은 UDP 소켓을 여는 것은'client연결로 식별되고, 소켓을 명시적으로 바인딩하는 것은'server동작으로 식별돼요.
link-guard 인자는 #f 또는 세 인자의 프로시저일 수 있어요.
- 접근 확인을 촉발한 기본 프로시저를 나타내는 심볼 — 접근을 거부하기 위해 예외를 발생시킬 때 유용해요.
- 링크로 만들 파일을 나타내는 완전한 경로(Paths 참고).
- 링크의 내용을 나타내는 경로 — 두 번째 인자 경로에 상대적일 수 있어요. 이 경로는 접근을 확인하기 전에 확장되거나 정규화되지 않아요.
link-guard가 #f이면, 항상 exn:fail을 발생시키는 기본 프로시저가 사용돼요.
file-guard, network-guard, link-guard의 반환 값은 무시돼요. 접근을 거부하려면 프로시저가 예외를 발생시키거나 기본 호출의 문맥에서 벗어나(escape)야 해요. 프로시저가 반환하면 부모의 해당 프로시저가 같은 입력으로 호출되고, 이런 식으로 보안 가드 체인을 따라 올라가요.
file-guard, network-guard, link-guard 프로시저는 접근 확인 대상 기본(primitive)을 호출한 스레드에서 호출돼요. 브레이크는 켜져 있을 수도 있고 꺼져 있을 수도 있어요(브레이크(Breaks) 참고). 완전 연속(continuation) 점프는 file-guard나 network-guard 호출로 들어가거나 나오는 것을 막아요(프롬프트, 구분 연속, 배리어(Prompts, Delimited Continuations, and Barriers) 참고).
parameter
(current-security-guard) → security-guard?
(current-security-guard guard) → void?
guard : security-guard?
파일시스템과 네트워크에 대한 접근을 제어하는 현재 보안 가드를 결정하는 파라미터예요.