Microsoft MVP성태의 닷넷 이야기
Team Foundation Server: 30. 소스 서버 보안 [링크 복사], [링크+제목 복사],
조회: 20654
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

TFS - 소스 서버 보안


이전에, ".NET Framework 소스 코드 디버깅" 방법에 대해서 설명해 드렸죠.

VS.NET SP1 + .NET Framework 소스 코드 디버깅
; https://www.sysnet.pe.kr/2/0/623

그리고, 닷넷 프레임워크 소스 코드 디버깅이 부러우신 분들에게 여러분의 응용 프로그램도 그와 같은 디버깅 기능을 제공할 수 있는 방법 또한 설명해 드렸습니다.

TFS Team Build + Symbol Server
; https://www.sysnet.pe.kr/2/0/599

TFS Team Build + Source Server = 소스 코드 디버깅
; https://www.sysnet.pe.kr/2/0/600

위의 글을 보고, 그때 당시 저희 회사 직원 한분이 질문을 하셨습니다. "보안은 가능한가? 중요한 프로그램의 소스 코드가 노출되는 것을 원하지 않는 사람들에게는!"

사실, 중간 언어를 사용하여 제작된 응용 프로그램에게 있어 소스 코드 보안이 얼마나 의미가 있을까 하는 생각이 들지만... ^^ 어쨌든 결론을 먼저 말씀드리면 기본적으로는 해당 소스 코드 접근을 아무나 할 수 없도록 제한하고 있습니다. TFS를 사용했으니, 적당한 권한이 있는 TFS 사용자 계정으로만 접근이 가능한 것이지요.

이를 확인하기 위해, 위에서 설명한 글대로 테스트를 해보면 TFS 계정으로 로그인 가능한 PC에서는 정상적으로 소스 코드를 가져와서 BP(Break Point) 등의 디버깅 작업이 가능하지만, 그 외의 상황에서 디버깅을 하면 다음과 같은 문자열이 출력창에 나오는 것을 확인할 수 있습니다.

SRCSRV:  tf.exe view /version:111 /noprompt "$/CustomSetup/MyApp/Window.xaml.cs" /server:http://mytfsserver:8080/ 
        /console >"C:\temp\MyApp\111\Window.xaml.cs"
         TF30063: You are not authorized to access mytfsserver.
SRCSRV:  Error text detected: "access"
SRCSRV:  MYSERVER is unavailable - bypassing
SRCSRV: 소스 서버가 'C:\Documents and Settings\[myaccount]\Local Settings\Apps\2.0\24NO1ZB0.HK6\QO42ZQRY.Z9A\deve..tion_028b1aabb69e8c8f_0001.0000_8d02b66fb01975e6\MyApp.exe' 모듈에서 'd:\TeamBuild\CustomSetup\MyApp\Window.xaml.cs' 파일에 대한 소스 코드를 가져올 수 없습니다. The specified network resource or device is no longer available.
SRCSRV:  MYSERVER is unavailable - bypassing
SRCSRV: 소스 서버가 'C:\Documents and Settings\[myaccount]\Local Settings\Apps\2.0\24NO1ZB0.HK6\QO42ZQRY.Z9A\deve..tion_028b1aabb69e8c8f_0001.0000_8d02b66fb01975e6\MyApp.exe' 모듈에서 'd:\TeamBuild\CustomSetup\MyApp\Window.xaml.cs' 파일에 대한 소스 코드를 가져올 수 없습니다. The specified network resource or device is no longer available.

위의 tf.exe가 어떻게 통신하는지 fiddler를 통해서 확인해 보면, 아래와 같은 POST 요청을 확인할 수 있습니다.

POST /VersionControl/v1.0/repository.asmx HTTP/1.1
User-Agent: Team Foundation (TF.exe, 9.0.30729.1)
X-TFS-Version: 1.0.0.0
X-TFS-Session: 577d0db7-a265-4252-ae2f-cb9660ea5844, CommandView
accept-language: ko-KR
Content-Type: application/soap+xml; charset=utf-8
Host: mytfsserver:8080
Content-Length: 592
Expect: 100-continue
Accept-Encoding: gzip
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns="http://schemas.microsoft.com/TeamFoundation/2005/06/VersionControl/ClientServices/03"
                  xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Body>
        <QueryItems>
            <items>
                <ItemSpec item="$/CustomSetup/MyApp/Window.xaml.cs" />
            </items>
            <version xsi:type="ChangesetVersionSpec" cs="111" />
            <deletedState>NonDeleted</deletedState>
            <itemType>File</itemType>
            <generateDownloadUrls>true</generateDownloadUrls>
        </QueryItems>
    </soap:Body>
</soap:Envelope>

물론, 계정이 유효하지 않다면 위의 요청 이후에 발생하는 권한 협상 과정에서 실패하게 되어 소스 코드를 다운로드할 수 없지만, 성공한다면 다음과 같은 요청으로 이어져서 정상적으로 소스코드를 "압축된 상태"로 다운로드 받게 됩니다.

=== 소스 코드 요청 ===
GET /VersionControl/v1.0/item.asmx?type=rsa&amp;sfid=2008,0,0,0,0,0,0,0,0,0&amp;ts=633591724655273275&amp;s=LFZeHG1FLIelL3PxpBvYrOzncl1h8QC4tGkXyLOp2aK4gpntxaZvC5V6Ck2%2FhFhyGb6dEDOKhRRIIRXsqzil738362hazCsc3x2PFTig1b5tctUjTytj8DKstdDJAsTZoBtP%2FVf0dSy5c%2F2iB%2BTnCuyMU8cbaxSHSqThzbE2VNI%3D&amp;fid=2008 HTTP/1.1
User-Agent: Team Foundation (TF.exe, 9.0.30729.1)
X-TFS-Version: 1.0.0.0
X-TFS-Session: 577d0db7-a265-4252-ae2f-cb9660ea5844
accept-language: ko-KR
Host: mytfsserver:8080

=== 소스 코드 반환 ===
HTTP/1.1 200 OK
Date: Sun, 01 Feb 2009 11:54:25 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Content-Length: 1919
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/gzip

[...소스 코드의 압축된 내용...]




자, 그렇다면 문제는... 위와 같이 보안 오류가 발생하는 컴퓨터에서는 어떻게 해야 하느냐입니다.
그런데 ^^ 답은 이미 위에서 나온 거나 다름이 없지요. 바로 "http://.../repository.asmx" 통신에서 보안을 물어보지 않도록 하면 되는 것입니다. 즉, 웹 브라우저에서 "http://.../repository.asmx" 경로를 입력했을 때 보안창이 뜨지 않아야 합니다. 왜냐하면, Visual Studio IDE는 디버깅 중에 tf.exe를 실행하면서 devenv.exe 프로세스가 가진 계정 권한을 그대로 전달하기 때문입니다. (권한이 없는 경우, 물어보면 좋을 텐데. ^^)

그러니 해결 방법은 다음과 같이 2가지 방법이 있습니다.

  • 해당 컴퓨터에 TFS 로그인 계정과 동일한 ID/PW의 계정을 생성해서 로그인한다.
  • "control userpasswords2" 명령어를 이용해서 TFS 서버 (위에서는 mytfsserver) 이름으로 된 항목을 미리 생성해 둔다.

그중에서 2번째 방법을 한 화면에 표시해 보면 아래와 같은 동작이죠. ^^

[그림 1: 로그인 계정 등록]
how_to_access_source_server_1.PNG

마지막으로... "saltynut" 님의 정보에 의하면, TFS 2010부터는 소스 서버 구성에 대한 옵션을 TFS 차원에서 제공해 줄거라고 합니다. ^^



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... [31]  32  33  34  35  36  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12857정성태11/24/20217111개발 환경 구성: 606. WSL Ubuntu 20.04에서 파이썬을 위한 uwsgi 설치 방법
12856정성태11/23/20218933.NET Framework: 1121. C# - 동일한 IP:Port로 바인딩 가능한 서버 소켓 [2]
12855정성태11/13/20216256개발 환경 구성: 605. Azure App Service - Kudu SSH 환경에서 FTP를 이용한 파일 전송
12854정성태11/13/20217858개발 환경 구성: 604. Azure - 윈도우 VM에서 FTP 여는 방법
12853정성태11/10/20216204오류 유형: 766. Azure App Service - JBoss 호스팅 생성 시 "This region has quota of 0 PremiumV3 instances for your subscription. Try selecting different region or SKU."
12851정성태11/1/20217585스크립트: 34. 파이썬 - MySQLdb 기본 예제 코드
12850정성태10/27/20218785오류 유형: 765. 우분투에서 pip install mysqlclient 실행 시 "OSError: mysql_config not found" 오류
12849정성태10/17/20217897스크립트: 33. JavaScript와 C#의 시간 변환 [1]
12848정성태10/17/20218844스크립트: 32. 파이썬 - sqlite3 기본 예제 코드 [1]
12847정성태10/14/20218692스크립트: 31. 파이썬 gunicorn - WORKER TIMEOUT 오류 발생
12846정성태10/7/20218470스크립트: 30. 파이썬 __debug__ 플래그 변수에 따른 코드 실행 제어
12845정성태10/6/20218315.NET Framework: 1120. C# - BufferBlock<T> 사용 예제 [5]파일 다운로드1
12844정성태10/3/20216310오류 유형: 764. MSI 설치 시 "... is accessible and not read-only." 오류 메시지
12843정성태10/3/20216766스크립트: 29. 파이썬 - fork 시 기존 클라이언트 소켓 및 스레드의 동작파일 다운로드1
12842정성태10/1/202125140오류 유형: 763. 파이썬 오류 - AttributeError: type object '...' has no attribute '...'
12841정성태10/1/20218561스크립트: 28. 모든 파이썬 프로세스에 올라오는 특별한 파일 - sitecustomize.py
12840정성태9/30/20218649.NET Framework: 1119. Entity Framework의 Join 사용 시 다중 칼럼에 대한 OR 조건 쿼리파일 다운로드1
12839정성태9/15/20219685.NET Framework: 1118. C# 11 - 제네릭 타입의 특성 적용파일 다운로드1
12838정성태9/13/20219339.NET Framework: 1117. C# - Task에 전달한 Action, Func 유형에 따라 달라지는 async/await 비동기 처리 [2]파일 다운로드1
12837정성태9/11/20218252VC++: 151. Golang - fmt.Errorf, errors.Is, errors.As 설명
12836정성태9/10/20217866Linux: 45. 리눅스 - 실행 중인 다른 프로그램의 출력을 확인하는 방법
12835정성태9/7/20219092.NET Framework: 1116. C# 10 - (15) CallerArgumentExpression 특성 추가 [2]파일 다운로드1
12834정성태9/7/20217504오류 유형: 762. Visual Studio 2019 Build Tools - 'C:\Program' is not recognized as an internal or external command, operable program or batch file.
12833정성태9/6/20216941VC++: 150. Golang - TCP client/server echo 예제 코드파일 다운로드1
12832정성태9/6/20217809VC++: 149. Golang - 인터페이스 포인터가 의미 있을까요?
12831정성태9/6/20216343VC++: 148. Golang - 채널에 따른 다중 작업 처리파일 다운로드1
... [31]  32  33  34  35  36  37  38  39  40  41  42  43  44  45  ...