ACL 클래스

ACL 클래스

간단한 접근 제어 목록(Access Control List)을 다루는 클래스예요. 원격 접속 허용·거부 규칙을 문자열 배열로 관리할 수 있어요.

출처: Ruby 3.3 API

본문

접근 제어 목록은 접근을 제어하기 위해 "허용(allow)"과 "거부(deny)" 두 부분으로 구성돼요. 어떤 주소와도 매칭하려면 "all" 또는 "*"를 사용해요. 특정 주소와 매칭하려면 IPAddr가 이해할 수 있는 주소 또는 주소 마스크를 사용해요.

예시:

list = %w[
  deny all
  allow 192.168.1.1
  allow ::ffff:192.168.1.2
  allow 192.168.1.3
]

# From Socket#peeraddr, see also ACL#allow_socket?
addr = ["AF_INET", 10, "lc630", "192.168.1.3"]

acl = ACL.new
p acl.allow_addr?(addr) # => true

acl = ACL.new(list, ACL::DENY_ALLOW)
p acl.allow_addr?(addr) # => true

Constants

  • DEFAULT_ALLOW: 기본적으로 허용.
  • DEFAULT_DENY: 기본적으로 거부.
  • VERSION: ACL의 현재 버전.

Public Class Methods

new(list=nil, order = DENY_ALLOW)

list로부터 새로운 ACL을 만들어요. 평가 순서는 DENY_ALLOW 또는 ALLOW_DENY로 정해요.

ACL 목록은 "allow" 또는 "deny"와 주소, 또는 어떤 주소와도 매칭하는 주소 마스크/"all"/"*"로 이루어진 배열이에요.

%w[
  deny all
  allow 192.0.2.2
  allow 192.0.2.128/26
]
# File lib/drb/acl.rb, line 179
def initialize(list=nil, order = DENY_ALLOW)
  @order = order
  @deny = ACLList.new
  @allow = ACLList.new
  install_list(list) if list
end

Public Instance Methods

allow_addr?(addr)

addrinfo 주소 addr로부터의 연결을 허용할까요? Socket#peeraddr처럼 형식화돼 있어야 해요.

["AF_INET", 10, "lc630", "192.0.2.1"]
# File lib/drb/acl.rb, line 203
def allow_addr?(addr)
  case @order
  when DENY_ALLOW
    return true if @allow.match(addr)
    return false if @deny.match(addr)
    return true
  when ALLOW_DENY
    return false if @deny.match(addr)
    return true if @allow.match(addr)
    return false
  else
    false
  end
end

allow_socket?(soc)

Socket soc로부터의 연결을 허용할까요?

# File lib/drb/acl.rb, line 191
def allow_socket?(soc)
  allow_addr?(soc.peeraddr)
end

install_list(list)

이 ACL에 ACL 엔트리 목록을 추가해요.

# File lib/drb/acl.rb, line 223
def install_list(list)
  i = 0
  while i < list.size
    permission, domain = list.slice(i,2)
    case permission.downcase
    when 'allow'
      @allow.add(domain)
    when 'deny'
      @deny.add(domain)
    else
      raise "Invalid ACL entry #{list}"
    end
    i += 2
  end
end

더 알아보기

  • DRb의 접근 제어에 쓰이는 lib/drb/acl.rb에 정의되어 있어요.