# 허용 IP 대역 설정 (AllowUsers, DenyUsers)

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

#### AllowUsers와 DenyUsers 설정

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

**AllowUsers**

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

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

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

위 설정에서:

* `user1`: 모든 IP 대역에서 접근이 허용됨.
* `user2@192.168.1.*`: 192.168.1.\* 대역에서만 `user2`의 접근이 허용됨.
* `user3@*.example.com`: example.com 도메인의 하위 도메인에서만 `user3`의 접근이 허용됨.

**DenyUsers**

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

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

위 설정에서:

* `user4`: 모든 IP 대역에서 접근이 차단됨.
* `user5@192.168.1.*`: 192.168.1.\* 대역에서 `user5`의 접근이 차단됨.
* `user6@*.example.com`: example.com 도메인의 하위 도메인에서 `user6`의 접근이 차단됨.

#### IP 대역 설정의 수학적 표현

OpenSSH의 `AllowUsers`와 `DenyUsers` 디렉티브에서 사용되는 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})
$$

이때:

* $\mathbf{x}$: 접근하려는 클라이언트의 IP 주소.
* $\mathbf{y}$: 서버가 허용 또는 차단하려는 네트워크 주소.
* $\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의 우선 순위

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

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

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

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

#### AllowGroups와 DenyGroups 설정

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

**AllowGroups**

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

```plaintext
AllowGroups admins
```

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

```plaintext
AllowGroups admins developers
```

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

**DenyGroups**

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

```plaintext
DenyGroups temp_users
```

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

```plaintext
DenyGroups temp_users interns
```

위 설정에서는 `temp_users`와 `interns` 그룹에 속한 사용자의 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}
$$

2. 만약 사용자가 허용된 그룹에 속하지 않으면 접근이 차단된다.

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

$$
\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의 우선 순위

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

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

```plaintext
AllowGroups admins
DenyGroups temp_users
```

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