// 불펌스크립트시작 // 불펌스크립트 끝

제어판 → 프로그램 및 기능 → Windows 기능 켜기/끄기 에서 아래 스크린 샷처럼 .NET Framework 3.5(.NET 2.0 및 3.0 포함)을 활성화하는 식으로 닷넷 3.5를 설치하려고 시도해 봤는데요,



아래 스크린 샷처럼 오류 코드 : 0x800F0906 를 뿜으면서 더이상 진행되지 않아서 설치가 불가능한 증상이 있었습니다.



온라인 상에서 해결해 보려고 애를 써봤지만 잘 안돼서, 윈도우 설치할 때 썼던 ISO파일에 내장된 닷넷 3.5를 설치하는 식으로 해결을 했습니다.


일단 윈도우 ISO 파일을 마운트하거나 설치USB를 꼽고, 해당 드라이브에 sources\sxs 폴더가 있는지 확인합니다. 확인했으면...

화면 좌측하단 시작버튼에서 마우스 우클릭 → 명령프롬프트(관리자) 를 선택합니다. (아래 스샷 참고)



명령프롬프트(관리자) 창에 아래의 명령을 참고하여 입력합니다. 



DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:e:\sources\sxs

위 명령에서 붉게 표시한 e: 은 윈도우 ISO(혹은 USB)가 마운트된 드라이브 명으로 수정해야 합니다.



조금 기다리면 위 스크린 샷처럼 작업완료 메세지가 뜰겁니다. 그럼 설치가 끝난 겁니다.

제어판 → 프로그램 및 기능 → Windows 기능 켜기/끄기 로 진입해보면 아래 스크린샷처럼 닷넷 3.5가 활성화되어 있는 것을 확인할 수 있을겁니다.


로컬 보안 정책으로 설정할 수 있는 부분이 참 많다고 말씀드렸는데, 로컬 그룹 정책은 대부분 레지스트리로 설정이 가능하지만 로컬 보안 정책은 그렇지 않기 때문에, 다수의 서버에 동일한 설정을 적용해야 하는 경우 매우 난감할 것입니다. 일일이 마우스로 하나 하나 설정하다 보면 엄청난 시간이 소요되겠죠.

하지만 윈도우에서 마우스로 가능한 설정은 대부분 커맨드로도 가능하다는 점 명심하시기 바랍니다. 단지 몰라서 활용하지 못할 뿐이지요.

오늘은 로컬 보안 정책을 secedit 명령어를 통해 설정해 보겠습니다.



위 보안 설정을 커맨드로 처리해볼까요? 우선 secedit으로 현재 설정을 추출해봅시다.

예제) secedit /export /cfg c:\test.inf

이렇게 하시면 C 드라이브 루트에 test.inf 파일이 생성되겠죠? 이 파일을 열어서 쭈욱 보시면... 위 보안 정책들이 고스란히 들어있음을 알 수 있습니다.

크게 보면 4가지 섹션으로 구성되어 있는데요

[System Access]
[Event Audit]
[Registry Values]
[Privilege Rights]

계정 정책은 System Access에 들어있고, 감사 정책은 Event Audit에 들어있고, 사용자 권한 할당은 Privilege Rights에 들어있습니다. 보안 옵션은 Registry Values에도 들어있고,  System Access에도 일부 들어있습니다. 그런데 보안 옵션은 대부분 레지스트리 값으로 구성되어 있기 때문에, 굳이 secedit 커맨드를 사용하지 않아도 레지스트리로 설정이 가능합니다.

그렇다면 우리의 타겟은 바로 계정 정책, 감사 정책, 사용자 권한 할당이 되겠습니다. 저는 이 글에서 계정 정책만 가지고 예제를 구성해 보겠습니다.

예를 들어 위 그림에 나온 내용과 같이 설정하고 싶다면

암호는 복잡성을 만족해야 함 : 사용
최근 암호 기억 : 3개
최대 암호 사용 기간 : 31일
최소 암호 길이 : 8문자
최소 암호 사용 기간 : 1일
계정 잠금 기간 : 30분
계정 잠금 임계값 : 5번
다음 시간 후 계정 잠금 수를 원래대로 설정 : 30분


설정 파일 중에 설정에 필요한 부분만 골라서 남겨주시면 되는데, 마지막 [Version] 부분은 넣어줘야 오류가 나지 않더군요. 즉 위 내용을 설정 파일로 구성하면 아래와 같습니다.

[System Access]
MinimumPasswordAge = 1
MaximumPasswordAge = 31
MinimumPasswordLength = 8
PasswordComplexity = 1
PasswordHistorySize = 3
LockoutBadCount = 5
ResetLockoutCount = 30
LockoutDuration = 30
[Version]
signature="$CHICAGO$"
Revision=1



위 내용을 예를 들어 C 드라이브 루트에 test.inf 파일로 저장했다고 가정하겠습니다. 그리고 이 설정파일을 가지고 이제 각 서버에 들어가서 일괄적으로 적용하면 되겠죠?

예제) secedit /configure /db C:\test.sdb /cfg C:\test.inf

사실 /db 부분을 왜 꼭 지정해야 하는지는 잘 모르겠습니다만... 저는 임시 파일 정도로 취급하기로 했습니다. 작업 후 db 파일은 그냥 삭제해도 아무런 지장이 없더군요.

나머지 설명드리지 않은 감사 정책과 사용자 권한 할당 부분도 응용해서 활용하실 수 있겠죠? 사용자 권한 할당의 경우도 예를 들어 바로 앞 글에서 보여드렸던 시스템 종료 권한을 snoopy에게만 주고 싶다면

[Privilege Rights]
SeShutdownPrivilege = snoopy

정도가 되겠습니다.


서버나 보안 이야기 재미가 없으시죠? 일반 사용자에겐 거의 무의미한 이야기로 들릴 것인데, 저는 업무상 관련이 있기 때문에 누군가 저와 비슷한 일을 하는 분이 계시다면 도움이 될까 싶어 올려드리고 있습니다.

개인적으로 다수의 서버에 동일한 설정을 마우스 클릭 반복으로 처리하는 행위는 매우 소모적이라 생각하기 때문에, 항상 자동화 스크립트를 짜고 웬만한 설정은 다 스크립트로 처리하려 노력하고 있습니다. 예를 들어 위에서 진행했던 보안 설정들을 배치파일 하나로 만들어 볼까요?

@echo off
echo [System Access] > test.inf
echo MinimumPasswordAge = 1 >> test.inf
echo MaximumPasswordAge = 31 >> test.inf
echo MinimumPasswordLength = 8 >> test.inf
echo PasswordComplexity = 1 >> test.inf
echo PasswordHistorySize = 3 >> test.inf
echo LockoutBadCount = 5 >> test.inf
echo ResetLockoutCount = 30 >> test.inf
echo LockoutDuration = 30 >> test.inf
echo [Version] >> test.inf
echo signature="$CHICAGO$" >> test.inf
echo Revision=1 >> test.inf
secedit /configure /db test.sdb /cfg test.inf
del test.sdb
del test.inf
exit


위 내용을 CMD 파일로 저장해서 실행하면 보안 설정이 그대로 적용되겠죠? 저는 요즘 회사에서 이런거 만들면서 놀고(?) 있습니다. ^^

+ Recent posts