source

보조 그룹에만 연결된 경우 Oracle이 로컬 파일을 읽을 수 있습니까?

manycodes 2023. 7. 20. 22:01
반응형

보조 그룹에만 연결된 경우 Oracle이 로컬 파일을 읽을 수 있습니까?

오라클에서 매우 간단한 파이썬 스크립트를 실행하려고 합니다.오라클은 스크립트와 동일한 리눅스 박스에 있습니다.파일을 열고 체크섬을 만듭니다.오라클 내의 '재구성' 사용자에 의해 트리거됩니다.

Oracle 내에서 스크립트를 실행하는 것은 파일 소유자가 'oracle'이거나 그룹이 'oinstall'(Oracle의 기본 그룹)이거나 공용이 rx로 설정되어 있는 한 정상적으로 작동합니다.

문제는 다른 사용자:그룹을 사용해야 하며 공용 권한을 사용할 수 없다는 것입니다.오라클 사용자를 파일 그룹에 추가했습니다.

uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),202175(efs_data)

이전과 같이 Oracle 내에서 실행할 때는 실패하지만 Oracle 사용자를 대상으로 스크립트를 직접 실행할 때는 Linux 권한이 정상임을 알 수 있습니다.

무엇이 원인이 될 수 있습니까?Oracle은 Linux 권한을 덮어쓰는 다른 종류의 액세스 검사를 수행하고 있으며, 이는 보조 그룹을 무시하고 gid만 확인합니다.

'확장' 스키마로:

set serveroutput on size unlimited
declare
 x number;
begin
 x := run_cmd('/home/oracle/bin_dir/pytest.py');
 dbms_output.put_line('return:' || x);
end;

run_message:

create or replace function RUN_CMD( p_cmd  in varchar2) return number as
language java
name 'Util.RunThis(java.lang.String) return integer';

Util.실행 방법:

import java.io.*;
  import java.lang.*;

  public class Util extends Object
  {

    public static int RunThis(java.lang.String args)
    {
    Runtime rt = Runtime.getRuntime();
    int        rc = -1;

    try
    {
       Process p = rt.exec(args);

       int bufSize = 4096;
       BufferedInputStream bis =
        new BufferedInputStream(p.getInputStream(), bufSize);
       int len;
       byte buffer[] = new byte[bufSize];

       // Echo back what the program spit out
       while ((len = bis.read(buffer, 0, bufSize)) != -1)
          System.out.write(buffer, 0, len);

       rc = p.waitFor();
    }
    catch (Exception e)
    {
       e.printStackTrace();
       rc = -1;
    }
    finally
    {
       return rc;
    }
  }
}

/home/home/home/home/bin_home/pytest.py:

#! /usr/bin/python -W ignore::DeprecationWarning
import paramiko
import logging
import datetime
import pwd
import md5
import os

def test_file_open(local_file):
  print 'Trying to open: '+ local_file
  logging.info('Trying to open: ' + local_file)
  local_file_data = open(local_file, "rb").read()
  checksum = md5.new(local_file_data).hexdigest()
  return checksum

def main():
  logging.basicConfig(filename='/mounts/users/dmz/pytest.log', level=logging.INFO)
  logging.info('==========================================')
  logging.info('START: ' + str(datetime.datetime.now()))
  logging.info('getuid: ' + pwd.getpwuid( os.getuid() ).pw_name)
  logging.info('geteuid: ' + pwd.getpwuid( os.geteuid() ).pw_name)

  checksum = test_file_open('/test.txt')

  print 'Success!, checksum: ' + checksum
  logging.info('Success! checksum: ' + checksum)
  logging.info('END: ' + str(datetime.datetime.now()))

if __name__ == '__main__':
  main()

출력(파일 소유자로 오라클 사용):

-rwxrwx---. 1 oracle efs_data 0 Jun  7 19:56 /test.txt

INFO:root:==========================================
INFO:root:START: 2018-06-07 19:45:32.005429
INFO:root:getuid: oracle
INFO:root:geteuid: oracle
INFO:root:Trying to open: /test.txt
INFO:root:Success! checksum: 9f1e1404fd72b59121d45a8beb4dab5d
INFO:root:END: 2018-06-07 19:45:32.007078

출력(그룹 연결을 통한 권한만 있음):

-rwxrwx---. 1 root efs_data 0 Jun  7 19:57 /test.txt

INFO:root:==========================================
INFO:root:START: 2018-06-07 19:44:15.748559
INFO:root:getuid: oracle
INFO:root:geteuid: oracle
INFO:root:Trying to open: /test.txt

리눅스 그룹 액세스가 무시되는 것처럼 보이는 DIRECTORY 및 외부 테이블과 유사한 문제가 있습니다.저는 acl을 사용하여 Oracle 사용자에게 파일 소유권을 유지하면서 필요한 권한을 부여함으로써 해결할 수 있었습니다.

ll test.txt
-rwx------. 1 lunc users 940 Jun 13 09:34 test.txt

setfacl -m u:oracle:rwx test.txt

getfacl test.txt

# file: test.txt
# owner: lunc
# group: users
user::rwx
user:oracle:rwx
group::---
mask::rwx
other::---

ll test.txt
-rwxrwx---+ 1 lunc users 940 Jun 13 09:34 test.txt

Oracle은 적어도 외부 테이블의 경우 이를 수락하고 파일에 액세스할 수 있습니다.

언급URL : https://stackoverflow.com/questions/50748835/can-oracle-read-local-files-when-only-associated-by-secondary-group

반응형