Может ли оракул читать локальные файлы, только если они связаны со вторичной группой? - программирование
Подтвердить что ты не робот

Может ли оракул читать локальные файлы, только если они связаны со вторичной группой?

Я пытаюсь запустить очень простой скрипт python из Oracle. Oracle находится в том же Linux-окне, что и скрипт. Он открывает файл и создает контрольную сумму. Он запускается пользователем "повторного" в пределах оракула.

Запуск сценария изнутри Oracle работает нормально, пока владелец файла "oracle", или группа "oinstall" (группа по умолчанию для oracle), или публикация установлена в rx, скрипт работает.

Проблема в том, что мы должны использовать другую группу user: group, и мы не можем использовать общедоступные разрешения. Мы добавили пользователя оракула в группу файлов.

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

При запуске из Oracle, как мы это делали раньше, он теперь терпит неудачу, однако, когда sudo'ing в оракуле пользователя и запускает скрипт напрямую, он работает, поэтому мы знаем, что разрешения 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_cmd:

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

Util.RunThis:

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/oracle/bin_dir/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
4b9b3361

Ответ 1

У меня аналогичная проблема с DIRECTORY и внешними таблицами, где доступ к Linux-группе, по-видимому, игнорируется. Я смог решить, используя 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 принимает это (по крайней мере для внешних таблиц) и имеет доступ к файлу.