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

비밀번호

댓글 작성자
 




... 106  107  108  109  110  [111]  112  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11149정성태2/21/201723014오류 유형: 378. A 64-bit test cannot run in a 32-bit process. Specify platform as X64 to force test run in X64 mode on X64 machine.
11148정성태2/20/201721962.NET Framework: 644. AppDomain에 대한 단위 테스트 시 알아야 할 사항
11147정성태2/19/201721200오류 유형: 377. Windows 10에서 Fake 어셈블리를 생성하는 경우 빌드 시 The type or namespace name '...' does not exist in the namespace 컴파일 오류 발생
11146정성태2/19/201719855오류 유형: 376. Error VSP1033: The file '...' does not contain a recognized executable image. [2]
11145정성태2/16/201721336.NET Framework: 643. 작업자 프로세스(w3wp.exe)가 재시작되는 시점을 알 수 있는 방법 - 두 번째 이야기 [4]파일 다운로드1
11144정성태2/6/201724676.NET Framework: 642. C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (부록 1) - CallingConvention.StdCall, CallingConvention.Cdecl에 상관없이 왜 호출이 잘 될까요?파일 다운로드1
11143정성태2/5/201722089.NET Framework: 641. [Out] 형식의 int * 인자를 가진 함수에 대한 P/Invoke 호출 방법파일 다운로드1
11142정성태2/5/201730086.NET Framework: 640. 닷넷 - 배열 크기의 한계 [2]파일 다운로드1
11141정성태1/31/201724369.NET Framework: 639. C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (4) - CLR JIT 컴파일러의 P/Invoke 호출 규약 [1]파일 다운로드1
11140정성태1/27/201720129.NET Framework: 638. RSAParameters와 RSA파일 다운로드1
11139정성태1/22/201722809.NET Framework: 637. C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (3) - x64 환경의 __fastcall과 Name mangling [1]파일 다운로드1
11138정성태1/20/201721072VS.NET IDE: 113. 프로젝트 생성 시부터 "Enable the Visual Studio hosting process" 옵션을 끄는 방법 - 두 번째 이야기 [3]
11137정성태1/20/201719790Windows: 135. AD에 참여한 컴퓨터로 RDP 연결 시 배경 화면을 못 바꾸는 정책
11136정성태1/20/201718990오류 유형: 375. Hyper-V 내에 구성한 Active Directory 환경의 시간 구성 방법 - 두 번째 이야기
11135정성태1/20/201719977Windows: 134. Windows Server 2016의 작업 표시줄에 있는 시계가 사라졌다면? [1]
11134정성태1/20/201727403.NET Framework: 636. System.Threading.Timer를 이용해 타이머 작업을 할 때 유의할 점 [5]파일 다운로드1
11133정성태1/20/201723508.NET Framework: 635. C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (2) - x86 환경의 __fastcall [1]파일 다운로드1
11132정성태1/19/201734995.NET Framework: 634. C# 개발자를 위한 Win32 DLL export 함수의 호출 규약 (1) - x86 환경에서의 __cdecl, __stdcall에 대한 Name mangling [1]파일 다운로드1
11131정성태1/13/201723943.NET Framework: 633. C# - IL 코드 분석을 위한 팁 [2]
11130정성태1/11/201724439.NET Framework: 632. x86 실행 환경에서 SECURITY_ATTRIBUTES 구조체를 CreateEvent에 전달할 때 예외 발생파일 다운로드1
11129정성태1/11/201728827.NET Framework: 631. async/await에 대한 "There Is No Thread" 글의 부가 설명 [9]파일 다운로드1
11128정성태1/9/201723280.NET Framework: 630. C# - Interlocked.CompareExchange 사용 예제 [3]파일 다운로드1
11127정성태1/8/201722796기타: 63. (개발자를 위한) Visual Studio의 "with MSDN" 라이선스 설명
11126정성태1/7/201727538기타: 62. Edge 웹 브라우저의 즐겨찾기(Favorites)를 편집/백업/복원하는 방법 [1]파일 다운로드1
11125정성태1/7/201724368개발 환경 구성: 310. IIS - appcmd.exe를 이용해 특정 페이지에 클라이언트 측 인증서를 제출하도록 설정하는 방법
11124정성태1/4/201727818개발 환경 구성: 309. 3년짜리 유효 기간을 제공하는 StartSSL [2]
... 106  107  108  109  110  [111]  112  113  114  115  116  117  118  119  120  ...