보조 그룹에만 연결된 경우 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
'source' 카테고리의 다른 글
auth.User.groups: (필드).E304) 'User.groups'의 역방향 접근자가 'UserManage.groups'의 역방향 접근자와 충돌함 (0) | 2023.07.20 |
---|---|
판다의 큰 상관 행렬에서 가장 높은 상관 관계 쌍을 나열하시겠습니까? (0) | 2023.07.20 |
이전 커밋을 체크아웃하고 새 커밋으로 만듭니다. (0) | 2023.07.15 |
형식 스크립트의 문자열 보간, '자리 표시자'를 변수로 바꾸기 (0) | 2023.07.15 |
spring-boot:run과 spring-boot:start의 차이점은 무엇입니까? (0) | 2023.07.15 |