Microsoft MVP성태의 닷넷 이야기
Team Foundation Server: 30. 소스 서버 보안 [링크 복사], [링크+제목 복사],
조회: 26284
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... [136]  137  138  139  140  141  142  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1654정성태3/19/201425218개발 환경 구성: 219. SOS.dll 확장 모듈을 버전 별로 구하는 방법 [4]
1653정성태3/13/201420081.NET Framework: 428. .NET Reflection으로 다차원/Jagged 배열을 구분하는 방법
1652정성태3/12/201421159VC++: 76. Direct Show를 사용하는 다른 프로그램의 필터 그래프를 graphedt.exe에서 확인하는 방법파일 다운로드1
1651정성태3/11/201424766.NET Framework: 427. C# 컴파일러는 변수를 초기화시키지 않을까요?
1650정성태3/6/201425531VC++: 75. Visual C++ 컴파일 오류 - Cannot use __try in functions that require object unwinding [1]파일 다운로드1
1649정성태3/5/201420213기타: 44. BTN 스토어 앱 개인정보 보호 정책 안내
1648정성태3/5/201420595개발 환경 구성: 218. 스토어 앱 인증 실패 - no privacy statement
1647정성태3/3/201421817오류 유형: 224. 스카이드라이브 비정상 종료 - Error 0x80040A41: No error description available
1646정성태3/3/201431081오류 유형: 223. Microsoft-Windows-DistributedCOM 10016 이벤트 로그 에러 [1]
1645정성태3/1/201420862기타: 43. 마이크로소프트 MVP들이 모여 전국 세미나를 엽니다.
1644정성태2/26/201427822.NET Framework: 426. m3u8 스트리밍 파일을 윈도우 8.1 Store App에서 재생하는 방법파일 다운로드1
1643정성태2/25/201423638오류 유형: 222. 윈도우 8 Store App - APPX1204 SignTool Error: An unexpected internal error has occurred [1]
1642정성태2/25/201428217Windows: 91. 한글이 포함된 사용자 프로파일 경로 변경 [2]
1641정성태2/24/201425089기타: 42. 클래스 설명 [5]
1640정성태2/24/201446034.NET Framework: 425. C# - VLC(ActiveX) 컨트롤을 레지스트리 등록 없이 사용하는 방법 [15]
1639정성태2/23/201421764기타: 41. BBS 스토어 앱 개인정보 보호 정책 안내
1638정성태2/18/201444425Windows: 90. 실행 파일로부터 관리자 요구 권한을 제거하는 방법(부제: 크랙 버전을 보다 안전하게 실행하는 방법) [8]
1637정성태2/14/201425566Windows: 89. 컴퓨터를 껐는데도 어느 순간 자동으로 켜진다면? - 두 번째 이야기
1636정성태2/14/201421449Windows: 88. Hyper-V가 설치된 컴퓨터의 윈도우 백업 설정
1635정성태2/14/201422373오류 유형: 221. SharePoint - System.InvalidOperationException: The farm is unavailable.
1634정성태2/14/201422513.NET Framework: 424. C# - CSharpCodeProvider로 컴파일한 메서드의 실행이 일반 메서드보다 더 빠르다? [1]파일 다운로드1
1633정성태2/13/201425435오류 유형: 220. 2014년 2월 13일 이후로 Visual Studio 2010 Macro가 동작하지 않는다면? [3]
1632정성태2/12/201443370.NET Framework: 423. C#에서 DirectShow를 이용한 미디어 재생 [2]파일 다운로드1
1631정성태2/11/201422389개발 환경 구성: 217. Realtek 사운드 장치에서 재생되는 오디오를 GraphEditor로 녹음하는 방법
1630정성태2/5/201422694개발 환경 구성: 216. Hyper-V에 올려진 윈도우 XP VM에서 24bit 컬러 및 ClearType 활성화하는 방법
1629정성태2/5/201432536개발 환경 구성: 215. DOS batch - 하나의 .bat 파일에서 다중 .bat 파일을 (비동기로) 실행하는 방법 [1]
... [136]  137  138  139  140  141  142  143  144  145  146  147  148  149  150  ...