Microsoft MVP성태의 닷넷 이야기
Team Foundation Server: 30. 소스 서버 보안 [링크 복사], [링크+제목 복사],
조회: 26351
글쓴 사람
정성태 (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)
11074정성태10/20/201629293Windows: 126. Windows Server 2016 평가판을 정식 버전으로 라이선스 변경하는 방법
11073정성태10/20/201625308.NET Framework: 613. 윈도우 데스크톱 응용 프로그램(예: Console)에서 알림 메시지(Toast notifications) 띄우기 [1]파일 다운로드1
11072정성태10/20/201621857VC++: 102. 새로 추가한 ATL COM 객체가 regsvr32.exe로 등록이 안 되는 문제
11071정성태10/20/201625402.NET Framework: 612. UWP(유니버설 윈도우 플랫폼) 앱에서 콜백 함수 내에서의 UI 요소 접근 방법 [1]
11070정성태10/20/201619617Windows: 125. 윈도우 서버 2016 마이그레이션
11069정성태10/19/201627325.NET Framework: 611. C++ 개발자들을 위한 C# Thread 동작 방식 [2]
11068정성태10/19/201630516Windows: 124. 윈도우 운영체제의 시간 함수 (5) - TSC(Time Stamp Counter)와 QueryPerformanceCounter [12]파일 다운로드1
11067정성태10/18/201626839Windows: 123. 윈도우 운영체제의 시간 함수 (4) - RTC, TSC, PM Clock, HPET Timer [2]
11066정성태10/17/201624488Windows: 122. 윈도우 운영체제의 시간 함수 (3) - QueryInterruptTimePrecise, QueryInterruptTime 함수파일 다운로드1
11065정성태10/15/201629912Windows: 121. 윈도우 운영체제의 시간 함수 (2) - Sleep 함수의 동작 방식 [1]
11064정성태10/14/201621613.NET Framework: 610. C# - WaitOnAddress Win32 API 사용파일 다운로드1
11063정성태10/14/201637731Windows: 120. 윈도우 운영체제의 시간 함수 (1) - GetTickCount와 timeGetTime의 차이점 [5]파일 다운로드1
11062정성태10/12/201618329오류 유형: 361. WCF .svc 호출 시 Could not find a base address that matches scheme net.tcp 예외
11061정성태10/12/201630463오류 유형: 360. IIS - 500.19 오류 (0x80070021)
11060정성태10/12/201622936오류 유형: 359. WCF - .svc 요청시 404 Not Found
11059정성태10/11/201627171.NET Framework: 609. WPF - 다중 스레드 환경에서 데이터 바인딩의 INotifyPropertyChanged.PropertyChanged에 대한 배려 [1]파일 다운로드1
11058정성태10/8/201622510개발 환경 구성: 303. Windows 10 Bash Shell - 한글 환경을 영문으로 바꾸고 싶다면?
11057정성태10/8/201617887오류 유형: 358. Windows 10 bash shell - sudo: unable to resolve host ...
11056정성태10/8/201620780개발 환경 구성: 302. Windows 10 bash shell 시작 시 [...] packages can be updated.
11055정성태10/8/201621818.NET Framework: 608. double 값을 구할 때는 반드시 피연산자를 double로 형변환! [6]
11054정성태10/5/201625809개발 환경 구성: 301. "Let's Encrypt" SSL 인증서를 Azure Cloud Services(classic)에 업데이트하는 방법
11053정성태10/5/201620545.NET Framework: 607. C# try/catch/finally의 IL 코드 표현
11052정성태9/27/201634694개발 환경 구성: 300. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 [7]파일 다운로드1
11051정성태9/25/201621870개발 환경 구성: 299. docker - c:\programdata\docker\windowsfilter 폴더 정리하는 방법파일 다운로드1
11050정성태9/24/201626591VC++: 101. 반올림하지 않고 double 변수 값 출력하는 방법 [3]
11049정성태9/24/201621049오류 유형: 357. 윈도우 백업 시 오류 - 0x81000037
... 106  107  108  109  110  111  112  113  [114]  115  116  117  118  119  120  ...