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에 정의되어 있어요.