Q&A

라이믹스 내장된 클론탭 파일웹 실행 방지 원리

2023.08.12 11:47
168
0
CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 7.4
문제 페이지 주소 비공개 (작성 후 5일 경과)

https://rhymix.org/manual/misc/crontab

 

문서에 보면 

 

라이믹스에 포함된 쉘 스크립트들은 웹에서 실행할 수 없으며, 웹크론 서비스 등으로 호출할 경우 오류를 표시하고 종료됩니다.

 

라고 적혀있습니다.

 

저도 api를 불러오는 파일을 제작하여 일반 웹에서 로봇들이 실행시키면 안되는 파일들을 만들었습니다.
일 반 php 파일인데  외부실행을 막자고

<?php if (!defined('__XE__')) exit; // 개별 페이지 접근 불가 

이걸 넣자니 크론탭 e에서도 XE를 거친게 아니니 작동을 안할것 같네요.

 

백그라운드에서 크론탭 해주고싶은 파일들입니다.

근데 그중에서는 인크루드도 해야하고 하는 작업등이 필요한 파일이라서

뭔가 www 폴더 안에 두어야지 작동될것 같다는 생각이 듭니다.

 

그래서

 

라이믹스에 포함된 쉘 스크립트들은 웹에서 실행할 수 없으며, 웹크론 서비스 등으로 호출할 경우 오류를 표시하고 종료됩니다.

이걸 해주게 하려면 어떤 코드를 추가해주면 될까요?

 

감사합니다.

톰캣 Lv. 11
시대의 흐름에 뒤떨어지지 않도록 아주 천천히지만 노력하고 있습니다.

댓글 16

  • 2023.08.12 12:18 #1780244

    common/scripts/common.php 파일을 인클루드하면 됩니다.

     

    웹 호출 방지뿐 아니라 root 권한 실행 방지, 퍼미션 꼬임 방지 등 crontab 사용시 발생할 수 있는 자잘한 실수들을 막아 주는 기능이 들어 있습니다.

     

  • 2023.08.12 12:20 #1780248
    와와 감사합니다!! 잘사용하겠습니다.
  • 2023.08.12 12:59 #1780256

    아 혹시 A파일이

    아래처럼 구성되어있습니다.

    <?php
    include '/home/사이트명/www/common/scripts/common.php';


    내용

    include '/home/사이트명/www/api/inc/1.php';
    exec("/usr/bin/php /home/사이트명/www/api/B.php");
    ?>





    아무래도 크론텝에서 불러와야하니

    include '/home/사이트명/www/common/scripts/common.php';
    이렇게 인크루드 주소를 주었거든요

    이렇게하니 실행이 안되는 것 같은데 혹시 include '/home/사이트명/www/common/scripts/common.php';
    경로가 잘못 되었을까요?
    B파일에서도 inc 폴더내의 1.php 파일에서도

    include '/home/사이트명/www/common/scripts/common.php';
    다 이 인크루드를 주었습니다.

    혹시 제가 잘못 설정한게 있을까요?

    Aug 12 21:59:01 localhost CROND[325666]:

    테스트용으로 1분으로 돌리고 있는데 크론탭 로그를 보면 계속 잘 실행되고 있습니다.

  • 2023.08.12 13:14 #1780262

    실행이 되는지 안되는지, 어떤 오류 때문에 실행이 안되는지는 에러 메시지를 봐야 알죠. 크론탭 실행 중 출력되는 내용들을 어딘가에 기록하도록 설정해야 합니다. 흔히 /dev/null로 보내버리곤 하는데, 이건 그냥 눈을 감고 에러를 보지 않겠다는 뜻이죠...

    * * * * * 실행할 명령 > /로그파일/경로.log 2>&1

    실제로 /home/사이트명/www/common/scripts/common.php 경로에 파일이 있고, 크론탭을 실행하는 계정 권한으로 그 파일을 읽을 수 있나요?

    php 파일에서 또다른 php 파일을 불러오는데 include를 하지 않고 exec을 하는 것도 이상하네요. 서버 설정으로 exec이 막혀 있는 경우가 꽤 많습니다.

  • 2023.08.12 13:28 #1780268

    exec 는 1번 파일 실행되고 2번 파일이 이어서 실행되길 원하는 마음에 해둔거긴한데 우선 그건 나중에 살펴보고 우선

     

    말씀 주신데로 하니 로그가 잘생기네요.

     

    pcntl 모듈이 활성화는 되어있는데
    root로 실행되면 안된다고 나오는것같네요.(사용자계정으로 클론탭을 추가해 보겠습니다)

    PHP Warning: PHP Startup: Unable to load dynamic library 'pcntl.so' (tried: /usr/lib64/php/modules/pcntl.so (/usr/lib64/php/modules/pcntl.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/pcntl.so.so (/usr/lib64/php/modules/pcntl.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
    This script must not be executed by the root user.

    방법찾아봐야겠습니다.

  • 2023.08.12 13:55 #1780279
    마지막 줄이 힌트입니다.
    This script must not be executed by the root user.
    라이믹스 크론탭을 root 권한으로 실행하시면 안됩니다.
  • 2023.08.14 09:34 #1780506

    어제는 또 외부 일정이 있어서 이제야 작업을 해보는데요.

    이거 이렇게
    //include '/home/계정명/www/common/scripts/common.php';

    이렇게 주석하니 root 이던 사용자 계정이던 This script must not be executed by the root user.
    해당 에러가 발생안하하고 클론탭에서 잘 실행이 됩니다.



    추가로 사용자 계정으로도
    include '/home/계정명/www/common/scripts/common.php';
    이렇게 클론탭에서 실행하면

    This script must be executed by the same user as the usual web server process (apache).

    에러가 나옵니다.

    심지어 php 파일에 chown -R apache:apache 까지 해줬는데도

    This script must be executed by the same user as the usual web server process (apache).
    이에러는 안없어지네요.

     

     

     

    include '/home/계정명/www/common/scripts/common.php';

     

    이 /common/scripts/common.php 파일이 

    This script must not be executed by the root user.

    및 

    This script must be executed by the same user as the usual web server process (apache).

    에러를 일으키는것같은데 혹시 원인이 있을까요?

     

    일반 생 php 파일로 라이믹스와 연결되지 않은 파일에

    /common/scripts/common.php만 인크루드 한 상황입니다.

     

     

    이래 저래 어떻게 할까 고민하다가

    www 보다 하나 상위 폴더에 파일을 올려서 클론탭e 해서 쓰는 중입니다.

     

    다행히 www 아래에 있지 않아도 잘 실행이 되는것같네요.

  • 2023.08.14 09:50 #1780513

    apache 유저가 파일을 소유해야 한다는 뜻이 아니라, apache 계정으로 crontab을 돌려야 한다는 뜻입니다. 사용자 계정이라고 다 되는 것이 아닙니다.

    크론탭 실행 과정에서 캐시파일을 생성하거나 그 밖의 파일을 읽고 쓸 수도 있는데, 일반적으로 웹에서 접속할 때 PHP를 실행하는 계정과 동일한 계정이 아니라면 나중에 캐시파일을 덮어쓰지 못하게 되는 등 여러 가지 문제가 발생합니다. files 아래에 수많은 파일과 폴더들이 있는데, 아주 깊숙한 곳에 숨어 있는 파일 딱 한두 개만 다른 계정이 소유하고 있어서 그걸 건드리기만 하면 퍼미션 오류가 난다고 생각해 보세요. 미쳐버릴 겁니다... 그래서 라이믹스 크론탭은 웹과 동일한 계정이 아니라면 실행할 수 없도록 되어 있습니다. 아주 중요한 안전장치입니다.

  • 2023.08.14 09:59 #1780519

    항상 도움주셔서 감사합니다.

    apache 계정은 생성한 계정이 아니라 로그인이 불가한 상태일텐데
    그렇다면 아파치 설치 폴더의 권한을
    chown -R 사용자계정:사용자계정으로 해줘야지 에러가 발생하지 않을까요?

     

    +@

    이제보니 심지어 주의사항에

     

    평소 웹서버를 실행하는 계정(예: apache, nginx, www-data 등)에서 crontab을 사용하여야 합니다. 다른 계정을 사용하거나 서버 관리자(root) 계정으로 실행을 시도할 경우 나중에 사이트에서 퍼미션 문제가 발생하거나 캐시파일이 꼬일 위험이 있습니다.

     

    라고 적혀 있기까지하네요.항상 민폐 주범이네요

     

    ++@

    찾고 찾아보니

     

    * * * * * user-name

    시간 띄우고 유저 네임을 아파치라고 적어주면되겠네요!!

     

    저는 무조건 해당 계정으로 로그인 하고 crontab -e 해줘야하는줄로만 안 바보였네요 ㅠㅠ

     

    +++@

     

    crontab -e 는 현재 계정으로 실행하는거네요

    vi /etc/crontab 로

     

    * * * * * apache apache /usr/bin/php 실행할파일  > 로그기록할폴더.log 2>&1
    로 최종 성공했습니다.

     

    감사드립니다.

     

    최종 결론!

    아파치나 엔진엑스가 실행중인 프로세스 명으로 클론탭을 돌리자!!!!
     

     

  • 2023.08.14 10:58 #1780534
    chown 명령과는 아무 관계 없습니다. 무언가를 소유했는지 아닌지가 중요한 것이 아니라, 무엇을 실행하고 있는지가 중요하니까요. apache 같은 계정들은 소유한 것이 거의 없고 일만 열심히 하는 고마운 존재이지요.^^

    루트 권한으로 crontab -u 계정명 -e 명령을 실행하여 다른 계정의 크론탭을 편집할 수도 있습니다.
  • 2023.08.14 15:04 #1780558
    대부분 게시판 100에 100기진곰님의 손길이 안닿은 곳이 없어 기진곰님은 당연히 운영권한이 있으시다고 생각했는데 제가 속단 하였나 봅니다.

    기진곰님께 항상 여러모로 도움을 많이 받아 정말 마음깊이 진심으로 감사드립니다.
    반복된 표현이 많지만 진심입니다.

    (그리고 아주 별개지만 궁금한 것 검색하다보면 지금은 떠나신 웹지기님의 질문과 제가 궁금한게 겹치는게 많은데 너무 비슷한 질문이 다 보니 검색 후 웹지기 님글이 나올때는 행적을 쫓는 느낌도 들고 웹지기님의 전철를 밟는 것 같아서 뿌듯하기도하고 그렇습니다.)
  • 2023.08.14 10:16 #1780528

    정말 죄송한데 ㅠㅠ

    위 댓글의(https://xetown.com/questions/1780237#comment_1780506)
    /home/사이의 경로/www/

    사이의 경로만 "계정명" 으로 바꿔주실 수있으실까요?

    총 4번 적혀 있습니다.

    원인과 이유
    https://xetown.com/contact/1777668

    번거롭게 해드려 대단히 죄송합니다.

  • 2023.08.14 11:00 #1780538
    저는 XE타운 운영진이 아니어서 다른 사람의 댓글을 임의로 수정해 드릴 수 없습니다.
    문의게시판에 글을 남기셨다면 운영진 중 누군가가 도와주실 거예요.
  • 2023.08.12 13:52 #1780275

    php -v 해보면
    PHP Warning: PHP Startup: Unable to load dynamic library 'pcntl' (tried: /usr/lib64/php/modules/pcntl (/usr/lib64/php/modules/pcntl: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/pcntl.so

    pcntl 라이브러리를 깔았는데.. 설정도 심지어했는데 /usr/lib64/php/modules/ 폴더에 pcntl.so 파일이 없네요.

     

    aaaaa.PNG

     

    마지막 메타자료 만료확인(3:41:22 이전): 2023년 08월 12일 (토) 오후 07시 37분 25초.
    꾸러미 php-cli-7.4.33-8.el9.remi.x86_64가 이미 설치되어 있습니다.
    종속성이 해결되었습니다.
    처리가 필요하지 않습니다.
    완료되었습니다!
     

     

    php.ini 
    extension=pcntl
    extension=pcntl.so
     

     

    아무래도 php8.2 설치했다가  7.4로 내려오는과정에 뭔가가 꼬인게 아닐까 생각만 해봅니다 ㅠㅠ

  • 2023.08.12 15:59 #1780302
    pcntl 익스텐션을 사용하지 않으신다면, 해당 부분을 삭제하셔도 됩니다.

    해당 익스텐션은 PHP를 컴파일해서 설치해야 사용할 수 있는 것으로 보이는데, remi로 설치하셨다면 아마 사용이 불가능할 듯 합니다.

    https://www.php.net/manual/en/pcntl.installation.php
  • 2023.08.12 16:32 #1780311

    pcntl은 대부분의 리눅스 배포판이나 서드파티 저장소에서 패키지 설치 가능한 익스텐션입니다. 2023년 현재 일반적으로 사용할 만한 익스텐션 중 PHP 컴파일 설치가 필요한 것은 단 한 개도 없습니다. (좀 특이한 익스텐션이라면 pecl을 사용해서 익스텐션의 .so 파일만 별도로 컴파일하는 경우는 가끔 있지만...)

    질문자분은 PHP 버전 변경 과정에서 뭔가 깨진 것 같은데, 그것 때문에 crontab이 작동하지 않을 일은 없습니다. 로그에 워닝이 지저분하게 남을 뿐이지요. 라이믹스에서 pcntl을 사용하는 부분도 없으므로 급히 해결할 필요도 없습니다. 해당 워닝은 무시하고, crontab이 작동하지 않는 진짜 원인(위 댓글)을 찾아 해결하시면 됩니다.