PowerShell

PowerShell Repository 구성

delmaster 2017. 11. 3. 22:29

PowerShell Internal Repository 구성 및 서비스 방법에 대한 포스팅입니다.



PowerShell 모듈을 다운로드하기위해 PSGallery를 많이 사용하고 있습니다.

하지만 인터넷 연결이 불가능한 서버들의 경우 모듈설치를 위해 인터넷이 가능한곳에서 모듈파일을 다운로드 받아 서버로 복사하여 사용하는 방법밖에 없었습니다.

또한, 인터넷망의 Repository를 통해 인증/검증되지 않은 모듈을 설치 및 사용하여 여러 문제들이 발생되어 최소한 사용이 검증된 모듈들을 한곳(Internal Repository) 에 모아두고 배포하는것이 필요할수 있습니다.


이러한 문제들로인한 요구사항이 있다면, 외부에 공개되지 않은 내부 PowerShell Repository를 생성하여 서비스할 수 있습니다.

내부 PowerShell Repository는 크게 아래와 같은 2가지 형태로 구성/제공 할 수 있습니다.

1. SMB(공유폴더)를 이용하여 Repository 서비스

2. IIS를 이용하여 Repository 서비스


SMB의 경우 여러 보안상의 검토사항이 필요하기때문에 IIS를 통한 PowerShell Repository 서비스를 제공하는 방법을 알아보겠습니다.

 - SMB를 통한 서비스의 경우 규모가 작은곳에서 간단히 서비스 하기에는 유용합니다. 구성도 간단하고요.


사전준비

1. OS: Windows Server 2016 (2008R2 이상가능)

2. .NET Framework 4.5 이상

3. 인터넷 연결 가능


설치방법

1. IIS 설치 

IIS를 통해 PowreShell Repository를 구성하여 서비스할 예정이므로, 아래의 명령어를 통해 IIS의 구성요소를 설치합니다.

PS C:\> Install-WindowsFeature -Name Web-Server,Web-Default-Doc,Web-Static-Content,Web-Log-Libraries,Web-Stat-Compression,Web-Filtering,Web-Asp-Net45,Web-ISAPI-Filter,Web-ISAPI-Ext -IncludeManagementTools -Verbose

상기 설치를 완료하고 명령어를 통해 확인해보면 아래와 같은 역할/기능이 설치되었음을 알 수 있습니다.

PS C:\> Get-WindowsFeature -Name "web-*"


Display Name                                            Name                       Install State

------------                                            ----                       -------------

    [ ] 웹 응용 프로그램 프록시                         Web-Application-Proxy          Available

[X] 웹 서버(IIS)                                        Web-Server                     Installed

    [X] 웹 서버                                         Web-WebServer                  Installed

        [X] 보안                                        Web-Security                   Installed

            [X] 요청 필터링                             Web-Filtering                  Installed

            [ ] IIS 클라이언트 인증서 매핑 인증         Web-Cert-Auth                  Available

            [ ] IP 및 도메인 제한                       Web-IP-Security                Available

            [ ] URL 권한 부여                           Web-Url-Auth                   Available

            [ ] Windows 인증                            Web-Windows-Auth               Available

            [ ] 기본 인증                               Web-Basic-Auth                 Available

            [ ] 다이제스트 인증                         Web-Digest-Auth                Available

            [ ] 중앙 SSL 인증서 지원                    Web-CertProvider               Available

            [ ] 클라이언트 인증서 매핑 인증             Web-Client-Auth                Available

        [X] 상태 및 진단                                Web-Health                     Installed

            [X] HTTP 로깅                               Web-Http-Logging               Installed

            [ ] ODBC 로깅                               Web-ODBC-Logging               Available

            [X] 로깅 도구                               Web-Log-Libraries              Installed

            [ ] 사용자 지정 로깅                        Web-Custom-Logging             Available

            [ ] 요청 모니터                             Web-Request-Monitor            Available

            [ ] 추적                                    Web-Http-Tracing               Available

        [X] 성능                                        Web-Performance                Installed

            [X] 정적 콘텐츠 압축                        Web-Stat-Compression           Installed

            [ ] 동적 콘텐츠 압축                        Web-Dyn-Compression            Available

        [X] 일반적인 HTTP 기능                          Web-Common-Http                Installed

            [X] HTTP 오류                               Web-Http-Errors                Installed

            [X] 기본 문서                               Web-Default-Doc                Installed

            [X] 디렉터리 검색                           Web-Dir-Browsing               Installed

            [X] 정적 콘텐츠                             Web-Static-Content             Installed

            [ ] HTTP 리디렉션                           Web-Http-Redirect              Available

            [ ] WebDAV 게시                             Web-DAV-Publishing             Available

        [X] 응용 프로그램 개발                          Web-App-Dev                    Installed

            [ ] .NET 확장성 3.5                         Web-Net-Ext                    Available

            [X] .NET 확장성 4.6                         Web-Net-Ext45                  Installed

            [ ] ASP                                     Web-ASP                        Available

            [ ] ASP.NET 3.5                             Web-Asp-Net                    Available

            [X] ASP.NET 4.6                             Web-Asp-Net45                  Installed

            [ ] CGI                                     Web-CGI                        Available

            [X] ISAPI 필터                              Web-ISAPI-Filter               Installed

            [X] ISAPI 확장                              Web-ISAPI-Ext                  Installed

            [ ] SSI(Server Side Include)                Web-Includes                   Available

            [ ] WebSocket 프로토콜                      Web-WebSockets                 Available

            [ ] 응용 프로그램 초기화                    Web-AppInit                    Available

    [ ] FTP 서버                                        Web-Ftp-Server                 Available

        [ ] FTP 서비스                                  Web-Ftp-Service                Available

        [ ] FTP 확장성                                  Web-Ftp-Ext                    Available

    [X] 관리 도구                                       Web-Mgmt-Tools                 Installed

        [X] IIS 관리 콘솔                               Web-Mgmt-Console               Installed

        [ ] IIS 6 관리 호환성                           Web-Mgmt-Compat                Available

            [ ] IIS 6 메타베이스 호환성                 Web-Metabase                   Available

            [ ] IIS 6 WMI 호환성                        Web-WMI                        Available

            [ ] IIS 6 관리 콘솔                         Web-Lgcy-Mgmt-Console          Available

            [ ] IIS 6 스크립팅 도구                     Web-Lgcy-Scripting             Available

        [ ] IIS 관리 스크립트 및 도구                   Web-Scripting-Tools            Available

        [ ] 관리 서비스                                 Web-Mgmt-Service               Available

[ ] IIS 호스팅 가능한 웹 코어                           Web-WHC                        Available




2. IIS 구성
시작 > 실행 > INETMGR 을 통해 IIS 관리창을 열어 아래와 같이 사이트 > 웹사이트 추가를 클릭합니다.

새로운 창이 열리면 아래와 같이 입력해줍니다.
아래 예제를 위해 D:\Web\PSRepo.delmaster.net 이라는 폴더 구조를 생성하였고, 실제 파일은 없습니다.
(실제경로 및 사이트 이름, 호스트이름의 경우 호스팅하기 원하는 이름을 변경하여 구성하시면 되겠습니다.)
단, 아래 '응용프로그램풀' 이름의 경우(여기서는 PSRepo.delmaster.net) 이후 구성 단계에서 보안설정 시 사용되므로 기억해둡니다.




3. NuGet Server Web Application 다운로드 

첨부된 파일을 다운로드 받아 아래의 경로로 복사합니다. 

    여기서는 생성할 웹사이트명인 'PSRepo.delmaster.net' 폴더를 아래와 같은 구조로 생성하고 다운받은 파일을 넣었습니다.





4. 퍼미션 설정

압축을 푼 파일에 대해 '우클릭' > '속성' 을 눌러 아래와 같이 '편집' 버튼을 누른 후 새롭게 열리는 창에서 '추가' 버튼을 클릭합니다.



'위치' 를 눌러 도메인이 아닌 로컬 컴퓨터를 선택해줍니다. 아래 이미지의 PSREPO는 테스트서버의 호스트명이므로 당연히 컴퓨터 마다 다릅니다.


이후, '2번 IIS 구성' 단계에서 확인했던 '응용프로그램풀' 이름을 이용하여 추가하고, 뒤에 IUSR도 같이 입력하여 다음과 같은 형태로 추가해줍니다.  'IIS APPPOOL\PSREPO.DELMASTER.NET; IUSR'

(다른이름으로 생성하였다면 그 이름을 적어줍니다.)

만약 이름을 다시 확인해야할 필요가 있으면 아래와 같이 확인 가능합니다.('더보기'클릭)


추가가 완료되면 아래와 같이 확인되며, 기본 선택된 '읽기 및 실행', '폴더 내용 보기', '읽기' 권한만 있으면 됩니다.




5. 실제 호스팅에 사용될 응용 프로그램 추가

생성한 웹사이트를 우클릭하여 '응용 프로그램 추가' 를 클릭합니다.



이후 아래와 같이 입력/선택해줍니다.


추가가 완료되면 아래와 같은 구조가 만들어집니다.



6. 서비스 확인

생성한 웹사이트 하위에 만들어진 'repo'를 선택한 뒤, 오른쪽 응용프로그램 찾아보기(PSRepo.delmaster.net on *:80(http)찾아보기) 를 통해 웹브라우저를 통해 사이트를 확인해봅니다.



여기까지 잘 구성되었으면 아래와같은 사이트가 확인되며, 'here' 링크를 클릭하면 배포 가능한 목록이 나옵니다.

'here' 아래에 있는 'Repository URLs'의 URL은 이후에 사용되니 기억해두면 좋습니다.

'here'를 클릭했을때 현재 PSRepository에서 제공되는 항목들이 나타납니다. 

아직 Publish한 항목이 없으므로 빈 화면으로 나오는게 정상입니다.




7. 모듈/패키지 배포 구성

생성한 Repository에 사용자에게 제공할 모듈/패키지를 등록할 수 있도록 구성합니다.

먼저 아래와 그림과같이 응용프로그램 설정을 더블클릭합니다.



여러 설정들이 있는데 'apiKey'의 경우 구성한 Repository에 모듈/패키지를 등록할때 사용할 '암호' 라고 생각하면 됩니다. 해당 PSRepository의 관리자만 알고 있을 암호를 입력합니다. 권장되지는 않지만 만약 암호없이 누구나 업로드할 수 있도록 구성하려면 'requireApiKey'의 값을 'false'로 변경해주면 됩니다.


상기 작업이 완료되면 Powershell 창을 열어 아래와 같이 입력하여 패키지 제공자를 추가해줍니다.

Install-PackageProvider -Name NuGet -Verbose

Get-PackageProvider


이후, 아래의 내용을 ISE에서 입력하여 현재 컴퓨터의 Repository 리스트에 생성한 Repository 추가 작업을 진행합니다.

'Name' 부분에 입력한 'PSRepo' 가 우리가 IIS에 생성한 Repository를 인식할 이름이 됩니다.





8. 모듈 배포

배포할 모듈을 PSGallery에서 다운로드 받아 현재 컴퓨터에 설치 합니다.(여기서는 7Zip4PowerShell을 예제로 진행합니다.)

Install-Module -Name 7Zip4Powershell -Verbose




다운받은 '7Zip4PowerShell' 모듈을 우리가 생성한 Repository(PSRepo)에 배포 합니다.

Publish-Module -Name 7Zip4PowerShell -Repository PSRepo -NuGetApiKey delmaster.net -Verbose



최초 실행일때 아래와 같은 알람이 발생될 수 있으며, 해당 알람이 발생되면 'Y'를 눌러 해당 파일을 설치해주어야합니다.


상기 배포 작업이 완료된 후, 아래의 경로로 가보면 우리가 배포한 '7Zip4PowerShell' 이라는 이름의 폴더가 생성된것을 확인할 수 있습니다.


이 폴더 안으로 들어가면 .nupkg 확장자를 가진 NuGet 패키지가 보입니다.


또한, 웹브라우저에서 확인해보면 배포한 모듈명이 노출되는것을 확인할 수 있으며

PowerShell에서 아래의 명령을 통해 다운로드 설치가 가능함을 확인할수도있습니다.





9. 다른 서버(클라이언트)에서 생성한 Repository를 이용하여 모듈 설치

Repository를 구성한 서버가 아닌 다른 서버에 우리가 구성한 Repository를 추가하여, 조금전 배포한 7Zip4PowerShell을 설치해보겠습니다.

먼저 아래와 같이 NuGet 공급자를 설치해줍니다.


아래와 같이 Repository를 추가해줍니다.


추가한 Repository를 확인해보고, 배포된 7Zip4PowerShell을 설치해봅니다.

Get-PSRepository

Find-Module -Repository PSRepo

Install-Module -Name 7Zip4PowerShell -Repository PSRepo -Verbose





이상 PowerShell Repository를 생성하고, 생성된 Repository에 모듈을 배포하여 다른 서버에서 모듈을 설치하는 과정을 알아보았습니다.