OpenSSH에서 특정 사용자 또는 IP 주소 대역을 허용하거나 거부할 수 있는 기능은 서버 보안을 강화하는 중요한 방법 중 하나이다. 이 설정을 통해 시스템 관리자는 서버에 접근할 수 있는 사용자를 제한할 수 있으며, 네트워크 대역에 기반하여 특정 IP 주소에서만 접근을 허용하거나 차단할 수 있다. 이 과정은 주로 sshd_config 파일을 통해 설정되며, AllowUsers, DenyUsers, AllowGroups, DenyGroups와 같은 디렉티브를 사용하여 구체화된다.

AllowUsers와 DenyUsers 설정

AllowUsersDenyUsers는 특정 사용자 또는 사용자 그룹을 기반으로 SSH 접근을 제한하는 방법이다. 이 설정은 단순한 사용자 차단을 넘어, IP 주소 기반으로도 접근 제어를 할 수 있어 보다 정교한 보안 정책을 구현할 수 있다.

AllowUsers

AllowUsers는 접근을 허용할 사용자 계정을 지정하는 데 사용된다. 이 설정을 통해 명시적으로 허용된 사용자만 SSH 서버에 접근할 수 있으며, 그 외의 사용자는 모두 차단된다. 사용자는 단순히 사용자명만 입력할 수도 있고, IP 주소 범위를 지정하여 특정 IP 대역에서만 접근을 허용할 수 있다.

다음은 AllowUsers 설정의 형식이다:

AllowUsers user1 user2@192.168.1.* user3@*.example.com

위 설정에서:

DenyUsers

DenyUsers는 접근을 거부할 사용자 계정을 지정하는 데 사용된다. DenyUsers에 지정된 사용자는 시스템에 접근할 수 없다. 마찬가지로 IP 주소 또는 IP 대역을 기반으로 접근 제한을 설정할 수 있다.

DenyUsers user4 user5@192.168.1.* user6@*.example.com

위 설정에서:

IP 대역 설정의 수학적 표현

OpenSSH의 AllowUsersDenyUsers 디렉티브에서 사용되는 IP 대역은 네트워크의 서브넷을 기반으로 설정된다. 네트워크 주소와 서브넷 마스크를 사용하여 특정 범위 내에서 접근을 허용하거나 차단할 수 있다. 이를 수학적으로 표현하면, 주어진 IP 주소 \mathbf{x}가 네트워크 범위 \mathbf{y}에 속하는지 여부를 다음과 같이 확인할 수 있다.

서브넷 마스크를 \mathbf{m}이라 할 때, \mathbf{x}\mathbf{y}의 AND 연산이 \mathbf{y}와 동일하면 \mathbf{x}는 네트워크 범위 내에 있는 것으로 판단한다:

(\mathbf{x} \land \mathbf{m}) = (\mathbf{y} \land \mathbf{m})

이때:

예를 들어, 192.168.1.0/24 네트워크에 대한 서브넷 마스크는 255.255.255.0이며, 이는 다음과 같이 계산된다:

\mathbf{m} = 255.255.255.0 = 11111111.11111111.11111111.00000000_2

이 서브넷 마스크를 사용하여, 특정 IP 주소가 네트워크 범위에 속하는지 확인할 수 있다.

예시: IP 대역 접근 제어

서브넷 계산을 통해 IP 대역을 기반으로 접근 제어를 설정하는 과정을 예시로 설명하겠다.

예를 들어, 서버는 AllowUsers를 사용하여 192.168.1.0/24 대역에서만 접근을 허용한다고 가정한다. 여기서 서브넷 마스크는 255.255.255.0이므로, IP 주소가 이 대역에 속하는지 확인하기 위해 다음의 AND 연산을 수행한다.

클라이언트 IP 주소가 192.168.1.45일 때, 이를 2진수로 표현하면:

\mathbf{x} = 192.168.1.45 = 11000000.10101000.00000001.00101101_2

네트워크 주소가 192.168.1.0일 때, 이를 2진수로 표현하면:

\mathbf{y} = 192.168.1.0 = 11000000.10101000.00000001.00000000_2

서브넷 마스크는 255.255.255.0이므로:

\mathbf{m} = 11111111.11111111.11111111.00000000_2

이제 클라이언트 IP와 서브넷 마스크를 AND 연산하여 계산하면:

\mathbf{x} \land \mathbf{m} = 11000000.10101000.00000001.00000000_2 = 192.168.1.0

따라서 클라이언트 IP \mathbf{x}가 네트워크 범위에 속함을 확인할 수 있다. 이는 클라이언트가 허용된 대역에 있으므로, SSH 접근이 허용된다는 것을 의미한다.

반대로, 클라이언트 IP가 192.168.2.45라면:

\mathbf{x'} = 192.168.2.45 = 11000000.10101000.00000010.00101101_2

AND 연산을 수행하면:

\mathbf{x'} \land \mathbf{m} = 11000000.10101000.00000010.00000000_2 = 192.168.2.0

이 결과는 네트워크 주소 192.168.1.0과 일치하지 않으므로, 이 클라이언트는 접근이 차단된다.

AllowUsers와 DenyUsers의 우선 순위

AllowUsersDenyUsers를 동시에 설정할 때의 우선순위에 대해 알아보겠다. OpenSSH는 두 설정이 모두 적용되는 경우, AllowUsers에 명시된 사용자가 우선된다. 즉, DenyUsers에 해당하는 사용자라도 AllowUsers에 명시된 경우에는 접근이 허용된다. 반대로, AllowUsers에 포함되지 않은 사용자는 DenyUsers에 포함되지 않더라도 접근이 차단된다.

따라서 다음과 같은 설정을 했다고 가정해 보자.

AllowUsers user1@192.168.1.*
DenyUsers user2@192.168.1.*

이 경우 user1은 192.168.1.* 대역에서 접근이 허용되지만, user2는 동일한 대역에서 접근이 차단된다. OpenSSH는 기본적으로 보다 구체적인 규칙을 우선 적용하기 때문에, AllowUsersDenyUsers보다 먼저 적용된다.

AllowGroups와 DenyGroups 설정

AllowGroupsDenyGroups는 사용자 그룹을 기반으로 SSH 접근을 제어하는 설정이다. 이 설정을 통해 특정 그룹에 속한 사용자만 접근을 허용하거나, 특정 그룹에 속한 사용자의 접근을 차단할 수 있다. 이는 조직 내에서 여러 사용자가 동일한 서버에 접근하는 경우, 사용자 관리를 더욱 효율적으로 할 수 있는 방법이다.

AllowGroups

AllowGroups는 지정된 그룹에 속한 사용자만 SSH 접근을 허용하는 설정이다. 예를 들어, 다음 설정은 admins 그룹에 속한 사용자만 SSH 서버에 접근할 수 있도록 허용한다.

AllowGroups admins

이 설정을 적용하면, admins 그룹에 속하지 않은 모든 사용자는 SSH 접근이 차단된다. 또한 AllowGroups에 여러 그룹을 추가하여, 다수의 그룹에 속한 사용자들의 접근을 허용할 수 있다.

AllowGroups admins developers

위 설정에서는 admins 또는 developers 그룹에 속한 사용자가 SSH 서버에 접근할 수 있다.

DenyGroups

DenyGroups는 지정된 그룹에 속한 사용자의 SSH 접근을 차단하는 설정이다. 예를 들어, temp_users 그룹에 속한 사용자가 SSH 서버에 접근하는 것을 차단하려면 다음과 같은 설정을 할 수 있다.

DenyGroups temp_users

이 설정은 temp_users 그룹에 속한 모든 사용자의 SSH 접근을 차단한다. 또한, DenyGroups에 여러 그룹을 지정할 수 있으며, 이 경우 여러 그룹에 속한 사용자의 접근이 모두 차단된다.

DenyGroups temp_users interns

위 설정에서는 temp_usersinterns 그룹에 속한 사용자의 SSH 접근이 모두 차단된다.

그룹 기반 접근 제어의 수학적 표현

그룹 기반 접근 제어는 특정 그룹에 속한 사용자의 SSH 접근을 허용하거나 차단하는 방식으로, 사용자의 그룹 정보에 따라 조건을 평가한다. 수학적으로 이를 표현하면, 사용자 u가 그룹 G에 속하는지 여부는 집합 연산을 통해 다음과 같이 나타낼 수 있다.

사용자 u의 그룹 집합을 \mathbf{G_u}, 허용된 그룹 집합을 \mathbf{A_G}, 차단된 그룹 집합을 \mathbf{D_G}라고 정의한다. SSH 접근이 허용되는 조건은 다음과 같다.

  1. 사용자가 허용된 그룹에 속하고, 차단된 그룹에는 속하지 않을 때:
u \in \mathbf{A_G} \quad \text{and} \quad u \notin \mathbf{D_G}
  1. 만약 사용자가 허용된 그룹에 속하지 않으면 접근이 차단된다.

이는 논리적으로 다음과 같은 조건으로 표현된다:

\mathbf{P}(u) = \begin{cases} 1 & \text{if} \ u \in \mathbf{A_G} \ \text{and} \ u \notin \mathbf{D_G}, \\ 0 & \text{otherwise} \end{cases}

즉, 사용자가 허용된 그룹에 속하고 차단된 그룹에 속하지 않을 때만 SSH 접근이 허용된다.

AllowGroups와 DenyGroups의 우선 순위

AllowGroupsDenyGroupsAllowUsersDenyUsers와 유사하게 동작하며, AllowGroupsDenyGroups보다 우선 적용된다. 즉, AllowGroups에 명시된 그룹에 속한 사용자는 DenyGroups에 포함되더라도 접근이 허용된다.

예를 들어 다음 설정을 생각해봅시다.

AllowGroups admins
DenyGroups temp_users

이 경우, admins 그룹에 속한 사용자는 temp_users 그룹에 속하더라도 접근이 허용된다. 그러나 temp_users 그룹에 속하고 admins 그룹에 속하지 않은 사용자는 접근이 차단된다. 이와 같은 설정은 관리자가 특정 그룹에 속한 사용자에게만 SSH 접근 권한을 부여하고, 다른 그룹에 속한 사용자의 접근을 제한할 때 유용하다.