programing

Jenkins 오류 - 문서 프레임이 샌드박스에 저장되고 '스크립트 허용' 권한이 설정되지 않아 에서 스크립트 실행이 차단되었습니다.

codeshow 2023. 3. 18. 09:13
반응형

Jenkins 오류 - 문서 프레임이 샌드박스에 저장되고 '스크립트 허용' 권한이 설정되지 않아 에서 스크립트 실행이 차단되었습니다.

HTML에서 iFrame을 사용할 경우 샌드박스를 사용하여 'allow-scripts' 권한을 추가해야 합니다.

하지만 문제는 순수 Angular JS 어플리케이션에 iFrame이 전혀 없다는 것입니다.로컬 머신에서 실행하면 정상적으로 동작합니다.

서버에 배포하면 Chrome에 다음 오류와 함께 다음 오류 메시지가 표시됩니다.

'bootstrap.min.css' 스타일이 "style-src 'self' 컨텐츠 보안 정책 지시문을 위반하므로 로드를 거부했습니다.

문서 프레임이 샌드박스로 되어 있고 '스크립트 허용' 권한이 설정되어 있지 않아 'dashboard.html'에서 스크립트 실행이 차단되었습니다.

서드파티 사이트나 다른 곳에서 페이지를 호출하는 것이 아닙니다.이 경우 소스를 삽입하여 iframe에 표시할 수 있습니다.코드를 확인했는데 iframe이 전혀 없는 것을 확인할 수 있었습니다.

참고로 저는 매우 오래된 버전의 Chrome(26)와 Firefox(10)를 사용하고 있습니다.[조직상의 제약사항]이것은 IE11에서도 발생합니다(에러 메세지는 표시되지 않지만).페이지가 로드되지 않습니다.

원인은 무엇입니까?제가 뭐 놓친 거라도 있나요?어떤 조언이라도 해주면 정말 고맙겠습니다.

다음은 제가 하려는 일의 개요입니다.사소한 부분만 잘라내서..

<html lang="en" ng-app="dashboard">
   <head>
      <title>Dashboard</title>
      <link href="css/bootstrap.min.css" rel="stylesheet">
      <script src="js/jquery.min.js"></script>
      <script src="js/angular.min.js"></script>
      <script src="js/ui-bootstrap-tpls-0.6.0.js"></script>
      <script src="js/bootstrap.min.js"></script>
      <script src="js/notifications.js"></script>
      <style>
         body { background-color: #F3F3F4; color: #676a6c; font-size: 13px;}
      </style>
      <script>
         var dashboardApp = angular.module('dashboard', ['ui.bootstrap', 'notificationHelper']);
         
         Type = {
            APP : 0, CTL : 1
         }
         
         
         function DashboardCtrl($scope, $location, $timeout, $http, $log, $q) {
            $scope.environments = [ { ... }];
            $scope.columns = [ { ... } ];
         
             $scope.Type = window.Type;
            $scope.applications = [{ ... }];
         
            $scope.selectedEnv = null;
         
            var resetModel = function(applications) {
                applications.forEach(function(app) {
                     var hosts=$scope.findHosts(app, $scope.selectedEnv);
                     if(hosts){
                         hosts.forEach(function(host){
                             $scope.initStatus(app.status,host);
                         });
                     }
                });
            };
         
            var timeoutPromise = null;
         
             $scope.initStatus = function (status,host) {
                 status[host]=[{
                     ...
                 }];
         
             };             
         }
         
      </script>
   </head>
   <body ng-controller="DashboardCtrl">
      <div class="request-notifications" ng-notifications></div>
      <div>
         <tabset>
            <tab ng-repeat="env in environments" heading="{{env.name}}" select="set(env)" active="env.tab_active">
               <div class="col-md-6" ng-repeat="column in columns" ng-class="{'vertical-seperator':$first}">
                  <div class="panel" ng-class="{'first-child':$first}">
                     <div class="panel-heading">
                        <h3>{{column.column}}</h3>
                     </div>
                     <div class="panel-body">
                        <div class="frontends" ng-repeat="layer in column.layers">
                           <h4>{{layer.name}}</h4>
                           <div class="category" ng-repeat="category in layer.categories" ng-class="category.css">
                              <div class="category-heading">
                                 <h4>{{category.name}}</h4>
                              </div>
                              <div class="category-body group" ng-repeat="group in category.groups">
                                 <div ng-if="!env[group.host]">
                                    <h4>{{group.name}}</h4>
                                    <span class="label label-danger">Not deployed</span>
                                 </div>
                                 <div ng-repeat="host in env[group.host]">
                                    <div class="group-info">
                                       <div class="group-name">{{group.name}}</div>
                                       <div class="group-node"><strong>Node : </strong>{{host}}</div>
                                    </div>
                                    <table class="table table-striped">
                                       <thead>
                                          <tr>
                                             ...
                                          </tr>
                                       </thead>
                                       <tbody>
                                          <tr class="testStatusPage" ng-repeat="app in apps | filter: { column: column.column, layer: layer.name, category: category.name, group: group.name } : true">
                                             <!-- Application Home Links -->
                                             <td class="user-link" ng-if="app.type === Type.A || app.type === Type.A1 || app.type === Type.B || app.type === Type.B1 || app.type === Type.C"><a href="{{app.link}}">{{app.text}}</a></td>                                                                                          <td ng-if="app.status[host].statusCode == 0" class="result statusResult"><span class="label label-success">Success</span></td>
                                             <td ng-if="app.status[svr].status != null && app.status[host].status != 0" class="result statusResult"><span class="label label-danger">{{app.status[host].error}}</span></td>
                                          </tr>
                                       </tbody>
                                    </table>
                                 </div>
                              </div>
                           </div>
                        </div>
                     </div>
                  </div>
               </div>
            </tab>
         </tabset>
      </div>
   </body>
</html>

Jenkins userContent 디렉토리에서 이 컨텐츠 HTML을 사용하고 있었습니다.최근 Jenkins 1.625 LTS의 최신 버전으로 업그레이드했는데, 응답 헤더에 다음 헤더를 추가하는 새로운 콘텐츠 보안 정책이 도입된 것 같습니다.브라우저는 스타일시트나 Javascript 등의 실행을 거부합니다.

X-Content-Security-Policy: sandbox; default-src 'none'; img-src 'self'; style-src 'self';

이 문제를 해결하려면 Jenkins에서 아래 속성을 리셋하여 이 헤더를 삭제해야 했습니다.

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

Jenkins 1.625로 업그레이드하여 userContent 폴더를 사용하는 사용자는 이 변경의 영향을 받을 수 있습니다.

상세한 것에 대하여는, https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy 를 참조해 주세요.

솔루션에는 다음 단계를 따라야 합니다.

  1. Jenkin 홈페이지를 엽니다.
  2. Manage Jenkins로 이동합니다.
  3. 스크립트 콘솔로 이동합니다.
  4. 그리고 아래 명령문의 콘솔 페이스트에서 실행을 클릭합니다.]시스템setProperty("hudson.model").Directory Browser 지원.CSP", "")
  5. 그 후 css와 js를 로드합니다.

메모: 위의 절차를 수행한 후에도 css와 js가 로드되지 않으면 브라우저 캐시와 쿠키를 클리어하고 페이지를 새로 고칩니다.

HTML Publisher Plugin에서도 같은 문제가 있었습니다.

Jenkins의 새로운 Content Security 정책에 따라 다음을 설정하여 건너뛸 수 있습니다.

hudson.model.Directory Browser 지원.CSP=script-src 'cript-src';

UPDATE: Jenkins 2.x에서 어떤 이유로 인수를 다시 업데이트해야 했습니다. CSP 값이 비어 있는 경우, 대신 script-src 'script-src' 외부 HTML 페이지를 완전하게 표시하려면 , 다음의 순서에 따릅니다.

- Dhudson. 모델.Directory Browser 지원.CSP=

Windows 에서는 Jenkins 홈디렉토리에 jenkins.xml 가 있어, Jenkins 시스템 속성등의 글로벌 JVM 옵션을 설정할 수 있습니다.인수 태그 아래에 추가합니다.

<arguments> -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle "-Dhudson.model.DirectoryBrowserSupport.CSP= " -jar "%BASE%\jenkins.war" --httpPort=8080 </arguments>

대부분의 Linux 배포판의 경우 JENKINS_ARGS 내부 파일을 다음과 같이 수정할 수 있습니다.

/etc/default/module(또는 jenkins-oc)

CentOS의 경우 JENKINS_JAVA_OPTIONS inside 파일을 수정합니다.

/etc/sysconfig/module(또는 jenkins-oc)

「Content Security Policy Reference 」의 자세한 예를 참조해 주세요.http://content-security-policy.com/

Ubuntu에서 호스팅되는 Jenkins의 경우:

  1. 에 붙이다/etc/default/jenkins

    JAVA_ARGS="${JAVA_ARGS} -Dhudson.model.DirectoryBrowserSupport.CSP=\"\" "
    
  2. http://<your jenkins hostname>/safeRestart

(이 옵션 및 기타 옵션에 대해서는http://https://wiki.jenkins.io/display/JENKINS/Features+controlled+by+system+properties) 를 참조해 주세요.

UPD : /safeRestart 는 upd 。 않을 수 sudo service jenkins restart.

위의 답변은 Ubuntu 16.04에서 Jenkins 2.46.2와 함께 사용할 수 없었습니다.JAVA_를 변경해야 했습니다./etc/default/jenkins의 ARGS:

JAVA_ARGS="-Djava.awt.headless=true  -Dmail.smtp.starttls.enable=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"sandbox allow-scripts; style-src 'unsafe-inline' *;script-src 'unsafe-inline' *;\""

자세한 내용은 이쪽

Amazon Linux /etc/sysconfig/jenkins 경::

#JENKINS_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=sandbox"

JENKINS_ARGS="-Dhudson.model.DirectoryBrowserSupport.CSP=\"\""

언급URL : https://stackoverflow.com/questions/34315723/jenkins-error-blocked-script-execution-in-url-because-the-documents-frame

반응형