[Fortify] SSC Authorization Token 관리

토큰은 Fortify API또는 fortifyclinet 유틸리티에서 SSC의 ID/Password 대신 인증에 사용되는 일종의 문자열 이며, fortifyclient를 사용해 SSC로 부터 발급받고 명시된 기간 동안만 한정적으로 사용할 수 있다.

포티파이에서 각 기능의 인증에 사용되는 토큰의 종류 및 권한정보는 SSC 밑에 WEB-INF/internal/serviceContext.xml 파일에 명시되어 있다.

토큰은 사용자별로 권한별로 모두 다르며, user를 명시하지 않으면 공통 토큰이 사용된다.

■ 토큰 발급 받기

fortifyclient -url http:///ssc -user -password <패스워드> token -gettoken -daysToLive <유효기간(일)>

사용 예)

$ fortifyclient -url http://10.10.10.47:8080/ssc -user admin -password mypass123 token -gettoken AnalysisUploadToken -daysToLive 90

Authorization Token: 0cb09f2c-c0a4-4147-8d83-e948cc74e7d4이것이 발급받은 토큰

이 명령은 90일간 사용할 수 있는 분석결과 업로드 권한을 가진 AnalysisUploadToken을 얻는다.
디폴트로 토큰의 최대 사용기간은 90일 까지다.

$ fortifyclient -url http://10.10.10.47:8080/ssc listprojects -authtoken 0cb09f2c-c0a4-4147-8d83-e948cc74e7d4

ID Name Version
4949 TEST_APP 1.0
8438 TEST_APP2 2.0

▣ 토큰 이름

✔ AnalysisUploadToken (maxDaysToLive:90)
이 다중 사용 토큰 사양은 사용자가 여러 업로드를 위해 Fortify 프로젝트 보고서 (FPR)를 애플리케이션 버전에 프로그래밍 방식으로 업로드하고 사용자와 연관된 모든 애플리케이션 버전을 나열하려는 경우 SSC(Software Security Center)에 대한 인증을 용이하게하는 데 사용됩니다.

✔ AuditToken (90)
이 다중 사용 토큰 사양은 사용자가 프로그래밍 방식으로 문제를 검토하고 감사 작업을 수행하려는 경우 SSC(Software Security Center)에 대한 인증을 용이하게하기 위해 사용해야합니다.

✔ AnalysisDownloadToken (90)
이 다중 사용 토큰 사양은 사용자가 Fortify 프로젝트 보고서 (FPR)를 프로그래밍 방식으로 다운로드하고 사용자와 관련된 모든 응용 프로그램 버전을 나열하려는 경우 SSC(Software Security Center)에 대한 인증을 용이하게하는 데 사용되어야합니다.

✔ AnalysisDownloadToken (90)
이 다중 사용 토큰 사양은 사용자가 Fortify 프로젝트 보고서 (FPR)를 프로그래밍 방식으로 다운로드하고 사용자와 관련된 모든 응용 프로그램 버전을 나열하려는 경우 SSC(Software Security Center)에 대한 인증을 용이하게하는 데 사용되어야합니다.

✔ UploadFileTransferToken (1)
일반적으로 수동으로 생성되지 않는 일회용 토큰 사양. 자동화 스크립트는 / fileTokens 엔드 포인트를 사용하여 프로그래밍 방식으로 작성하여 인증 된 세션 내에서 파일 업로드를 지원해야합니다.

✔ DownloadFileTransferToken (1)
일반적으로 수동으로 생성되지 않는 일회용 토큰 사양. 자동화 스크립트는 / fileTokens 엔드 포인트를 사용하여 프로그래밍 방식으로 작성하여 인증 된 세션 내에서 파일 다운로드를 지원해야합니다.

✔ ReportFileTransferToken (1)
일반적으로 수동으로 생성되지 않는 일회용 토큰 사양. 자동화 된 스크립트는 / fileTokens 엔드 포인트를 사용하여 프로그래밍 방식으로 작성하여 인증 된 세션 내에서 기존 보고서 다운로드를 지원해야합니다.

✔ CloudCtrlToken (90)
(더 이상 사용되지 않음 – 대신 ScanCentralCtrlToken을 사용하십시오)

✔ ScanCentralCtrlToken (90)
이 토큰 사양은 Fortify ScanCentral CLI 도구와 함께 사용됩니다. 사용에 대한 자세한 내용은 Fortify ScanCentral 설명서를 참조하십시오.

✔ ScanCentralOneTimeJobToken (1)
일반적으로 수동으로 생성되지 않는 일회용 토큰 사양. 이 토큰은 ScanCentral 클라이언트에서 프로그래밍 방식으로 생성합니다.

✔ CloudOneTimeJobToken (1)
(더 이상 사용되지 않음 – ScanCentralOneTimeJobToken으로 대체 됨)

✔ WIESystemToken (90)
내부 토큰 사양 – WIE에서 프로그래밍 방식으로 생성합니다. 개별 사용을위한 것이 아닙니다.

✔ WIEUserToken (90)
내부 토큰 사양 – WIE에서 프로그래밍 방식으로 생성합니다. 개별 사용을위한 것이 아닙니다.

✔ UnifiedLoginToken (1)
이 토큰 스펙은 대부분의 REST API에 액세스 할 수있는 기능을 제공합니다. 하루 미만의 단기 자동화에 적합합니다.

✔ ReportToken (90)
이 다용도 토큰 사양은 프로그래밍 방식으로 기존 보고서를 검색하고 새 보고서를 생성하며 기존 보고서를 삭제하는 기능을 제공합니다.

✔ PurgeProjectVersionToken (1)
이 다중 사용 토큰 사양은 프로그래밍 방식으로 모든 애플리케이션 버전 목록을 요청하고 SSC에서 애플리케이션 버전을 제거하는 기능을 제공합니다.

✔ VSTSExtensionToken (90)
이 다중 사용 토큰 사양은 Fortify VSTS 확장에서 FPR을 SSC에 업로드하고 선택적으로 Fortify ScanCentral에 스캔을 제출하는 데 사용됩니다.

✔ CIToken (365)
이 다중 사용 토큰 사양은 빌드 프로세스의 일부로 Software Security Center에 FPR을 자동으로 업로드하고 빌드중인 애플리케이션 버전에 대한 취약성 통계를 다운로드하는 Fortify 연속 통합 플러그인과 함께 사용하도록 설계되었습니다.

■ 토큰의 사용기간 알아내기

$ fortifyclient -url http://10.10.10.47:8080/ssc -user admin -password mypass123 listtokens

ID Owner Creation Date Expire Date Creation I.P.

72381 admin 2016. 10. 19 2017. 1. 17 127.0.0.1
72384 admin 2016. 10. 19 2017. 1. 17 127.0.0.1
72387 admin 2016. 10. 19 2017. 1. 17 127.0.0.1
72390 admin 2016. 10. 19 2016. 10. 20 127.0.0.1
72393 admin 2016. 10. 19 2016. 10. 20 127.0.0.1
72396 admin 2016. 10. 19 2017. 1. 17 127.0.0.1
72399 admin 2016. 10. 19 2017. 1. 17 127.0.0.1
72411 admin 2016. 10. 19 2017. 1. 17 10.10.10.47
72415 admin 2016. 10. 19 2017. 1. 17 10.10.10.47

■ 토큰의 최대 사용기간 늘리기

SSC토큰의 디폴트 최대 사용기간은 90일을 넘지 못한다. 이를 초과하기 위해서는 serviceContext.xml를 아래와 같이 수정해 주어야 한다.

  1. 토큰의 최대 기간 설정

/WEB-INF/internal/serviceContext.xml
파일을 열어보면 각 토큰 종류별로 아래와 같은 XML 코드가 정의되어 있다.
이 중 maxDaysToLive 프로퍼티를 수정하여 최대 늘릴 수 있는 토큰의 기간을 설정한다.
디폴트는 90일이나 36500일로 수정하여 거의 무제한으로 설정한다.

<bean id=”downloadToken” class=”com.fortify.manager.security.ws.AuthenticationTokenSpec”>
  <property name=”key” value=”AnalysisDownloadToken”/>
  <property name=”maxDaysToLive” value=”36500″/>
  <property name=”actionPermitted”>
    <list value-type=”java.lang.String”>
      <value>FPRDownloadRequest</value>
      <value>GetSingleUseFPRDownloadTokenRequest</value>
      <value>ActiveProjectVersionListRequest</value>
      <value>SearchProjectVersionRequest</value>
      <value>ProjectListRequest</value>
    </list>
  </property>
  <property name=”terminalActions”>
    <list value-type=”java.lang.String”>
      <value>InvalidateTokenRequest</value>
    </list>
  </property>
</bean>

수정 후에는 SSC를 재시작해야 적용된다.

  1. 각 토큰별 사용기간 재설정

사용 예)

admin 계정의 AnalysisDownloadToken의 사용기간을 15년(5400일)으로 조정한다.

$ fortifyclient -url http://10.10.10.47:8080/ssc -user admin -password mypass123 token -gettoken AnalysisDownloadToken -user admin -daysToLive 5400

변경된 결과는 아래 명령을 사용하여 확인한다.

$ fortifyclient -url http://10.10.10.47:8080/ssc -user admin -password mypass123 listtokens -user admin

■ 토큰 종류 추가하기

/WEB-INF/internal/serviceContext.xml

파일의 적당한 부분에 토큰 bean을 추가하고 SSC를 재시작 한다.

NewToken을 최대 권한으로 추가한 예:

        <bean id="NewToken" class="com.fortify.manager.security.ws.AuthenticationTokenSpec">
            <property name="key" value="NewToken"/>
            <property name="capabilityDescription">
                <value>
                    <![CDATA[
                    This multi-use token specification should be used to facilitate authentication to Software
                    Security Center (SSC) when a user wishes to programmatically review issues and perform audit actions.
                    ]]>
                </value>
            </property>
            <property name="maxDaysToLive" value="36500"/>
            <property name="actionPermitted">
                <list value-type="java.lang.String">
                    <value>(GET|DELETE)=/api/v\d+/reports/\d+</value> <!-- get report | delete report -->
                    <value>(GET|POST)=/api/v\d+/reports</value> <!-- get reports | generate report -->
                    <value>(GET|PUT|POST|DELETE|HEAD|OPTIONS)=/api/.*</value>
                    <value>ActiveProjectVersionListRequest</value>
                    <value>AuditViewRequest</value>
                    <value>BatchCreateUpdateAndAssignCustomTagsRequest</value>
                    <value>BugParamsRequest</value>
                    <value>BugTrackerAssignmentRequest</value>
                    <value>CheckCurrentUserPermissionRequest</value>
                    <value>CloudCtrlUrlRequest</value>
                    <value>CloudOneTimeJobTokenRequest</value>
                    <value>CreateAuditSessionRequest</value>
                    <value>CustomTagListForProjectVersionRequest</value>
                    <value>DeleteSavedReportsRequest</value>
                    <value>DeregisterWIERequest</value>
                    <value>DescriptionAndRecommendationRequest</value>
                    <value>downloadFileTransferURLAccess</value>
                    <value>FileBugRequest</value>
                    <value>FilterSetsAndFoldersUpdateRequest</value>
                    <value>FPRDownloadRequest</value>
                    <value>FPRUploadRequest</value>
                    <value>GenerateReportRequest</value>
                    <value>GET=/api/v\d+/cloudmappings/mapByVersion\w+</value>
                    <value>GET=/api/v\d+/projectVersions/\d+/artifacts</value> <!-- get artifacts in PV -->
                    <value>GET=/api/v\d+/projectVersions</value> <!-- get project versions -->
                    <value>GET=/download/.*</value>
                    <value>GetDynamicScanDetailsRequest</value>
                    <value>GetDynamicScanSummariesRequest</value>
                    <value>GetFeaturesetsRequest</value>
                    <value>GetProjectVersionIdentifiersRequest</value>
                    <value>GetSingleUseFPRDownloadTokenRequest</value>
                    <value>GetSingleUseFPRUploadTokenRequest</value>
                    <value>GroupingValuesRequest</value>
                    <value>InvalidateAuditSessionRequest</value>
                    <value>IssueListRequest</value>
                    <value>LinkProjectVersionRequest</value>
                    <value>OnParameterChangeRequest</value>
                    <value>PerformAuditActionRequest</value>
                    <value>POST=/api/v\d+/artifacts/(action/purge/?|\d+/action/?)</value> <!-- submit artifact purge action -->
                    <value>POST=/api/v\d+/projectVersions/(action/purge/?|\d+/action/?)</value> <!-- submit PV purge action -->
                    <value>POST=/download/.*</value> <!-- required by flex -->
                    <value>ProjectListRequest</value>
                    <value>ProjectTemplateDownloadRequest</value>
                    <value>ProjectTemplateListRequest</value>
                    <value>ProjectVersionHasAuditedIssuesRequest</value>
                    <value>ProjectVersionIssueAuditHistoryRequest</value>
                    <value>PurgeProjectVersionRequest</value>
                    <value>RegisterWIERequest</value>
                    <value>reportFileTransferURLAccess</value>
                    <value>SavedReportByIdRequest</value>
                    <value>SavedReportListForProjectVersionRequest</value>
                    <value>SavedReportListRequest</value>
                    <value>SearchProjectVersionRequest</value>
                    <value>SetDynamicScanStatusRequest</value>
                    <value>TestBugTrackerConfigurationRequest</value>
                    <value>TraceNodesRequest</value>
                    <value>UnifiedLoginTokenExtensionRequest</value>
                    <value>uploadFileTransferURLAccess</value>
                    <value>VerifyCloudOneTimeJobTokenRequest</value>
                </list>
            </property>
            <property name="terminalActions">
                <list value-type="java.lang.String">
                    <value>InvalidateTokenRequest</value>
                    <value>DELETE=/api/v\d+/auth/token</value>
                </list>
            </property>
        </bean>

이렇게 추가한 토큰키는 아래처럼 사용될 수 있다.

$ fortifyclient -url http://10.10.10.47:8080/ssc -user admin -password mypass123 token -gettoken JenkinsToken -daysToLive 3650

Authorization Token: 6c6205ae-1c22-4ea9-858e-cae2e6e3a8ad

위로 스크롤