보안 가드

보안 가드 (Security Guards)

보안 가드는 스레드가 파일, 디렉터리, 네트워크 연결 등에 접근할 때 호출되는 접근 확인 프로시저 묶음이에요. make-security-guard로 만들고, current-security-guard 파라미터로 현재 가드를 지정해요.

출처: Racket Reference

본문

14.6 보안 가드

procedure

(security-guard? v) → boolean?
  v : any/c

vmake-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.
  • 165535(포함) 사이의 정확한(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-guardnetwork-guard 호출로 들어가거나 나오는 것을 막아요(프롬프트, 구분 연속, 배리어(Prompts, Delimited Continuations, and Barriers) 참고).

parameter

(current-security-guard) → security-guard?
(current-security-guard guard) → void?
  guard : security-guard?

파일시스템과 네트워크에 대한 접근을 제어하는 현재 보안 가드를 결정하는 파라미터예요.

더 알아보기