연습 - 네트워크 액세스 제한
사용자는 앱 서버에 연결하여 주문을 입력하고, 계정을 업데이트하고, 유사한 작업을 수행합니다. 그러면 앱 서버가 이러한 변경 내용으로 데이터베이스를 업데이트합니다. 사용자에게 데이터베이스에 저장된 개인 데이터가 있으므로 신뢰할 수 있고 필요한 리소스에서만 액세스를 허용하는 것이 중요합니다. 네트워크를 통해 SQL 데이터베이스에 대한 액세스를 제어할 수 있는 여러 가지 방법이 있습니다.
방화벽 규칙
Azure SQL Database에는 데이터베이스 서버 자체와 개별 데이터베이스 모두에 대한 네트워크 액세스를 허용하거나 거부하는 기본 제공 방화벽이 있습니다. 먼저, SQL Database 방화벽은 Azure SQL Database에 대한 모든 공용 액세스를 차단합니다. 데이터베이스 서버에 액세스하려면 Azure SQL Database에 액세스를 가능하게 하는 하나 이상의 서버 수준 IP 방화벽 규칙을 지정해야 합니다. IP 방화벽 규칙을 사용하여 인터넷이 허용하는 IP 주소 범위 및 Azure 애플리케이션 Azure SQL Database의 연결 시도 가능 여부를 지정할 수 있습니다.
방화벽 규칙은 서버 또는 데이터베이스 수준에서 구성됩니다. 규칙은 특히 데이터베이스에 대한 연결을 설정할 수 있는 네트워크 리소스를 명시합니다. 수준에 따라 적용할 수 있는 규칙은 다음과 같습니다.
- 서버 수준 방화벽 규칙
- Azure 서비스에 대한 액세스 허용
- IP 주소 규칙
- 가상 네트워크 규칙
- 데이터베이스 수준 방화벽 규칙
- IP 주소 규칙
참고
SQL Data Warehouse는 서버 수준 IP 방화벽 규칙만 지원하며, 데이터베이스 수준 IP 방화벽 규칙은 지원하지 않습니다.
이러한 규칙의 작동 방식을 자세히 살펴보세요.
서버 수준 방화벽 규칙
이 규칙은 클라이언트가 모든 Azure SQL 서버, 즉, 동일한 논리 서버 내의 모든 데이터베이스에 액세스할 수 있게 해줍니다. 서버 수준에서 적용할 수 있는 세 가지 유형의 규칙이 있습니다.
Azure 서비스에 대한 액세스 허용 규칙에서는 Azure 내의 서비스를 Azure SQL Database에 연결할 수 있습니다. 활성화되면 이 설정은 모든 Azure 공용 IP 주소에서 보낸 통신을 허용합니다. 이 통신에는 Azure App Service 및 Azure Container Service와 같은 모든 Azure PaaS(Platform as a Service)와 아웃바운드 인터넷 액세스 권한이 있는 Azure VM이 포함됩니다. 이 규칙은 포털의 방화벽 창에서 ON/OFF 옵션을 통해 또는 시작 및 끝 IP 주소로 0.0.0.0이 있는 IP 규칙을 통해 구성할 수 있습니다.
이 규칙은 Azure SQL Database에 액세스해야 하는 Azure Logic Apps 또는 Azure Functions와 같은 Azure의 PaaS 서비스에서 실행 중인 애플리케이션을 사용할 때 사용됩니다. 이러한 서비스의 대부분은 고정 IP 주소가 없으므로 이 규칙은 데이터베이스에 연결할 수 있도록 합니다.
Important
이 옵션은 다른 고객 구독에서의 연결을 포함하여 Azure에서의 모든 연결을 허용하도록 방화벽을 구성합니다. 이 옵션을 선택할 때 로그인 및 사용자 권한이 부여된 사용자만으로 액세스를 제한하는지 확인합니다.
IP 주소 규칙은 특정 공용 IP 주소 범위를 기반으로 하는 규칙입니다. 허용되는 공용 IP 범위에서 연결하는 IP 주소는 데이터베이스에 연결할 수 있습니다.
데이터베이스에 액세스해야 하는 고정 공용 IP 주소가 있을 때 이러한 규칙을 사용할 수 있습니다.
가상 네트워크 규칙을 사용하면 하나 이상의 Azure 가상 네트워크 내에서 지정된 서브넷에 명시적으로 연결할 수 있습니다. 가상 네트워크 규칙은 데이터베이스에 대한 더 강력한 액세스 제어를 제공할 수 있으며 기본 설정 옵션이 될 수 있습니다. Azure 가상 네트워크 주소 공간은 프라이빗이므로 퍼블릭 IP 주소에 대한 노출을 효과적으로 제거하고 사용자가 제어하는 주소에 대한 연결을 보호할 수 있습니다.
데이터베이스에 액세스해야 하는 Azure VM이 있는 경우 가상 네트워크 규칙을 사용합니다.
서버 수준 규칙의 경우 포털, PowerShell, CLI 및 T-SQL(Transact-SQL)을 통해 이러한 모든 규칙을 만들고 조작할 수 있습니다.
데이터베이스 수준 방화벽 규칙
이러한 규칙은 논리 서버의 개별 데이터베이스에 대한 액세스를 허용하고 데이터베이스 자체에 저장됩니다. 데이터베이스 수준 규칙의 경우 IP 주소 규칙만 구성할 수 있습니다. 서버 수준에서 적용될 때와 동일한 기능을 하지만 데이터베이스에만 범위가 지정됩니다.
데이터베이스 수준 규칙의 이점은 이식성입니다. 데이터베이스를 다른 서버로 복제하는 경우 데이터베이스 수준 규칙은 데이터베이스 자체에 저장되므로 복제됩니다.
데이터베이스 수준 규칙의 단점은 IP 주소 규칙만 사용할 수 있다는 것입니다. 이러한 규칙으로 인해 유연성이 제한되고 관리 오버헤드가 증가할 수 있습니다.
데이터베이스 수준 방화벽 규칙은 T-SQL을 통해서만 만들고 조작할 수 있습니다.
네트워크 액세스 제한 실습
데이터베이스 수준 IP 방화벽 규칙을 사용하여 보안을 강화하고 데이터베이스의 이식성을 높이는 것이 가장 좋습니다. 각 데이터베이스를 개별적으로 구성하는 데 시간을 소비하지 않도록 동일한 액세스 요구 사항을 가진 여러 데이터베이스가 있는 경우 관리자와 서버 수준 IP 방화벽 규칙을 사용합니다.
이러한 규칙이 실제로 작동하는 방식 및 필요한 것만 허용하도록 네트워크 액세스를 보호하는 방법을 살펴봅니다. Azure SQL Database 논리 서버, 데이터베이스 및 애플리케이션 서버 역할을 하는 appServer Linux VM을 만들었습니다. 이 시나리오는 데이터베이스가 Azure SQL Database로 마이그레이션되고 가상 네트워크 내의 리소스가 데이터베이스에 액세스해야 하는 경우에 자주 나타납니다. Azure SQL Database의 방화벽 기능은 많은 시나리오에서 사용할 수 있지만, 이 예제는 실제로 적용할 수 있는 예제이며 각 규칙이 어떻게 작동하는지 보여줍니다.
방화벽 설정과 작동 방식을 살펴봅니다. 이 연습을 위해 Portal과 Cloud Shell을 모두 사용하겠습니다.
현재 만든 데이터베이스는 모든 연결로부터의 액세스를 허용하지 않습니다. 이러한 제한된 액세스는 의도적인 것이며 논리 서버 및 데이터베이스를 만들기 위해 실행한 명령을 기반으로 합니다. 액세스 권한이 없는지 확인합니다.
아직 연결되어 있지 않은 경우 Cloud Shell에서 Linux VM에 SSH로 연결합니다.
nnn.nnn.nnn.nnn
을 이전 단원의publicIpAddress
값으로 바꿉니다.ssh nnn.nnn.nnn.nnn
이전에 검색한
sqlcmd
명령을 다시 실행하여 데이터베이스에 연결을 시도합니다.[server-name]
을 사용자의 서버 이름으로 바꿉니다.[username]
및[password]
를 이전 단위에서 지정한ADMINUSER
자격 증명으로 바꿉니다. 셸이 특수 문자를 잘못 해석하지 않도록 사용자 이름 및 암호를 작은 따옴표로 묶습니다.sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
연결을 시도할 때 다음 출력과 유사한 오류가 표시됩니다. 데이터베이스에 대한 액세스가 허용되지 않으므로 이 출력이 필요합니다.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired. Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2AF9. Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible.Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
연결할 수 있도록 액세스 권한을 부여합니다.
Azure 서비스 규칙에 대한 액세스를 허용하는 서버 수준 사용
VM에 아웃바운드 인터넷 액세스 권한이 있으므로 Azure 서비스에 대한 액세스 허용 규칙을 사용하여 VM에서 액세스할 수 있습니다.
샌드박스를 활성화한 동일한 계정을 사용하여 Azure Portal에 로그인합니다.
맨 위에 있는 리소스, 서비스 및 문서 검색 상자에서 데이터베이스 서버 이름인
server-name
를 검색합니다. SQL 서버를 선택합니다.SQL Server 창의 왼쪽 메뉴 창에 있는 보안에서 네트워킹을 선택합니다.
예외까지 아래로 스크롤하고 Azure 서비스 및 리소스가 이 서버에 액세스할 수 있도록 허용 확인란을 선택한 다음 저장을 선택합니다. 시스템에서 해당 변경을 승인할 때까지 기다립니다.
SSH 세션으로 돌아가서 데이터베이스에 다시 연결합니다.
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
이때 연결할 수 있어야 합니다. 성공한 경우 sqlcmd 프롬프트가 표시됩니다.
1>
연결을 개방했지만 현재 이 설정을 통해 구독 외의 리소스를 비롯한 모든 Azure 리소스에서 액세스할 수 있습니다. 네트워크 액세스가 사용자가 제어할 수 있는 리소스로만 제한되도록 이 액세스를 추가로 제한합니다.
데이터베이스 수준 IP 주소 규칙 사용
데이터베이스 수준 IP 주소 규칙은 논리 서버의 개별 데이터베이스에만 액세스할 수 있도록 합니다. appServer VM의 고정 IP에 대한 액세스 권한을 부여하기 위해 여기서 하나를 사용합니다.
데이터베이스 수준 IP 규칙을 만들려면 몇 가지 T-SQL 명령을 실행해야 합니다. 규칙 이름, 시작 IP 주소 및 종료 IP 주소를 전달하는 경우 다음 규칙을 사용하여 데이터베이스 규칙을 만듭니다. 시작 및 끝 IP 주소를 동일하게 지정하여 단일 IP에 대한 액세스를 제한합니다. 액세스가 필요한 더 큰 주소 블록이 있는 경우 범위를 확장할 수 있습니다.
EXECUTE sp_set_database_firewall_rule N'My Firewall Rule', '40.112.128.214', '40.112.128.214'
sqlcmd 프롬프트에 있는 동안 다음 명령을 실행합니다. 두 위치 모두에서 appServer VM의 공용 IP 주소를 바꿉니다.
팁
다음과 같은 T-SQL 명령을 실행할 때 두 번째 줄의
GO
이(가)sqlcmd
프롬프트로 복사되지 않을 수 있습니다. 이 부분을 입력해야 할 수도 있습니다.GO
명령이 없으면 T-SQL 명령이 실행되지 않으므로 반드시 이 명령을 실행해야 합니다.EXECUTE sp_set_database_firewall_rule N'My Firewall Rule', '[From IP Address]', '[To IP Address]'; GO
명령이 완료된 후에는
exit
를 입력하여 sqlcmd를 종료합니다. SSH를 통해 연결 상태를 유지합니다.Azure Portal에서 SQL Server에 대한 네트워킹 창의 Azure 서비스 및 리소스에서 이 서버에 액세스할 수 있도록 허용을 선택 취소하고 저장을 선택합니다. 이 변경으로 인해 모든 Azure 서비스에서 액세스할 수 없지만 서버에 대한 데이터베이스 수준 IP 규칙이 있으므로 연결할 수 있습니다.
Cloud Shell로 돌아가서 SSH를 통해 연결된 VM에서 데이터베이스에 다시 연결합니다.
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
이때 연결할 수 있어야 합니다. 성공하면 sqlcmd 프롬프트가 표시됩니다.
1>
데이터베이스 수준 규칙을 사용하면 구체적으로 데이터베이스에 대한 액세스를 격리할 수 있습니다. 이 규칙은 데이터베이스별로 구성된 네트워크 액세스를 유지하려는 경우 유용합니다. 여러 데이터베이스가 동일한 수준의 네트워크 액세스를 공유하는 경우 서버 수준 규칙을 사용하여 서버의 모든 데이터베이스에 동일한 액세스 권한을 적용하여 관리를 간소화할 수 있습니다.
서버 수준 IP 주소 규칙 사용
데이터베이스 수준 규칙은 훌륭한 옵션이지만 appServer VM을 연결해야 하는 동일한 서버에 여러 데이터베이스가 있는 경우에는 어떻게 해야 하나요? 데이터베이스 수준 규칙을 각 데이터베이스에 추가할 수 있지만 데이터베이스를 추가할수록 작업이 더 많이 필요할 수 있습니다. 관리 작업을 줄이려면 서버의 모든 데이터베이스에 적용되는 서버 수준 규칙으로 액세스를 허용합니다.
서버 수준 IP 규칙을 사용하여 연결할 수 있는 시스템을 제한합니다.
sqlcmd 프롬프트에서 다음 명령을 실행하여 데이터베이스 수준 IP 주소 규칙을 삭제합니다.
EXECUTE sp_delete_database_firewall_rule N'My Firewall Rule'; GO
명령이 완료된 후에는
exit
를 입력하여 sqlcmd를 종료합니다. SSH를 통해 연결 상태를 유지합니다.Azure Portal로 돌아가서 SQL Server에 대한 네트워킹 창의 방화벽 규칙에 따라 방화벽 규칙 추가를 선택합니다. 규칙의 이름을 appServer 허용으로 지정하고 시작 IP 및 끝 IP에 대한 appServer VM의 공용 IP 주소를 입력한 다음 확인을 선택합니다.
저장을 선택합니다.
Cloud Shell로 돌아가서 appServer VM에서 데이터베이스에 다시 연결해 봅니다.
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
이때 연결할 수 있어야 합니다. 서버 수준 규칙은 appServer VM의 공용 IP 주소를 기반으로 액세스를 허용합니다. 성공한 경우 sqlcmd 프롬프트가 표시됩니다.
1>
exit
를 입력하여 sqlcmd를 종료합니다. SSH를 통해 연결 상태를 유지합니다.
규칙에서 지정한 IP 주소에만 연결을 격리했습니다. 이 격리는 매우 효과적이지만, 연결해야 하는 시스템을 더 많이 추가함에 따라 여전히 관리가 까다로울 수 있습니다. 또한 정의된 IP 주소 범위의 고정 IP 또는 IP가 필요합니다.
IP 주소가 동적이고 변경되는 경우 연결을 보장하기 위해 규칙을 업데이트해야 합니다. appServer VM은 현재 동적 IP 주소로 구성됩니다. 이 IP 주소는 특정 시점에 변경되어 액세스가 중단되는 즉시 변경됩니다. 이제 가상 네트워크 규칙이 구성에 어떻게 도움이 되는지 살펴봅니다.
서버 수준 가상 네트워크 규칙 사용
이 경우 VM이 Azure에서 실행 중이므로 서버 수준 가상 네트워크 규칙을 사용하여 액세스를 격리하고 향후 서비스에서 쉽게 액세스할 수 있도록 할 수 있습니다.
Azure Portal로 돌아가서 여전히 네트워킹 창에 있는 상태로 가상 네트워크 아래의 가상 네트워크 규칙 추가를 선택합니다.
만들기/업데이트 가상 네트워크 규칙 대화 상자가 표시됩니다. 다음 값을 설정합니다.
설정 값 이름 기본값을 그대로 유지 구독 컨시어지 구독 가상 네트워크 appServerVNET 서브넷 이름 / 주소 접두사 appServerSubnet / 10.0.0.0/24 활성화를 선택하여 서브넷에서 서비스 엔드포인트를 사용하도록 설정한 다음, 엔드포인트에서 규칙을 만들 수 있게 되면 확인을 선택합니다.
IP 주소 규칙을 제거합니다. appServer 허용 규칙 옆에 있는 ...를 선택하고 삭제를 선택한 다음 저장을 선택합니다.
Cloud Shell로 돌아가서 appServer VM에서 데이터베이스에 다시 연결해 봅니다.
sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
이때 연결할 수 있어야 합니다. 성공하면 sqlcmd 프롬프트가 표시됩니다.
1>
여기서 한 일은 SQL 서버에 대한 모든 공용 액세스를 효과적으로 제거합니다. 정의한 Azure 가상 네트워크의 특정 서브넷에서만 액세스를 허용합니다. 해당 서브넷에 앱 서버를 더 추가하면 추가 구성이 필요하지 않습니다. 해당 서브넷의 모든 서버는 SQL 서버에 연결할 수 있습니다.
이 구성으로 인해 컨트롤의 범위를 벗어난 서비스에 대한 노출이 제한되며 서버를 더 추가하는 경우에도 관리가 쉬워집니다. 이 방법은 Azure SQL Database에 대한 네트워크 액세스를 보호하는 데 효과적입니다.