2017年10月29日日曜日

[PowerShell] PowerShellからOracleを利用する方法

概要

PowerShellからODP.NETを利用してOracleデータベースにアクセスする。

PowerShellからODP.NETの利用

PowerShellから指定したパスのOracle.DataAccess.dllを読み込み、New-ObjectコマンドレットでODP.NETのオブジェクトを作成し利用する。

[System.Reflection.Assembly]::LoadFile("ORACLE_BASE\ORACLE_HOME\odp.net\bin\4\Oracle.DataAccess.dll") | Out-Null;

[String]$ConnectionString = "Data Source=hogehoge;User ID=ora_user;Password=ora_pass";

try {
    [Oracle.DataAccess.Client.OracleConnection]$oraConn | Out-Null;
    [Oracle.DataAccess.Client.OracleCommand]$oraCmd | Out-Null;
    [Oracle.DataAccess.Client.OracleDataReader]$oraReader | Out-Null;

    $oraConn = New-Object Oracle.DataAccess.Client.OracleConnection($ConnectionString);
    [void]$oraConn.Open();

    $oraCmd = New-Object Oracle.DataAccess.Client.OracleCommand;

    $oraCmd.Connection = $oraConn;
    $oraCmd.CommandText = "select table_name from user_tables";

    $oraReader = $oraCmd.ExecuteReader();
    while($oraReader.Read()) {
        Write-Host $oraReader["table_name"];
    }
} catch {
    Write-Host "error:$($Error[0])";
} finally {
    [void]$oraReader.Close();
    [void]$oraCmd.Dispose();
    [void]$oraConn.Close();
}

参考

  • なし。

2017年10月8日日曜日

[ansible] become_userでタスクの実行ユーザを変更できない場合の解決方法

概要

原則、rootユーザでタスクを実行する環境で、ある特定のタスクのみ実行ユーザを変更するためにbecome_userを使用したが、実行ユーザが変わらずにrootユーザでタスクが実行された。

事象

main.ymlで指定した'root user in ID'、'test1 user in ID'タスクが共に、rootユーザでidコマンドが実行される。

inventoryファイル

[all:vars]
ansible_become=true
ansible_become_method=sudo
ansible_become_user=root
ansible_become_pass=rootユーザのパスワード
ansible_ssh_user=sshユーザ
ansible_ssh_pass=sshユーザのパスワード

main.yml

- name: root user in ID
  shell: id
- name: test1 user in ID
  become: true
  become_method: sudo
  become_user: test1
  shell: id

原因

ansible_become_userで指定されたユーザをタスクのbecome_userでは上書きできないため。

対処

'ansible_become_user=root'をinventoryファイルから削除する。
ansible_become_userのデフォルト値はrootになるため、become_userが指定されていないタスクはrootユーザで実行される。

inventoryファイル

[all:vars]
ansible_become=true
ansible_become_method=sudo
ansible_become_pass=rootユーザのパスワード
ansible_ssh_user=sshユーザ
ansible_ssh_pass=sshユーザのパスワード

main.yml

- name: root user in ID
  shell: id
- name: test1 user in ID
  become: true
  become_method: sudo
  become_user: test1
  shell: id

参考

  • なし。

2017年9月20日水曜日

[Oracle] Oracle Database Gateway機能を使用してOracleからPostgreSQLのテーブルをアクセスする方法

概要

Oracle Database Gateway機能を使用するとOracleとOracle以外の異機種間サービスでデータのアクセスが可能となる。ここでは、Oracle Database Gateway機能を使用して、Solarisサーバで動作するOracleからLinuxサーバで動作するPostgreSQLのテーブルをアクセスする方法を記載する。
なお、Oracle Database Gateway機能の使用にあたり、追加のライセンスは不要。

事前準備

unixODBCドライバとPostgreSQL ODBCドライバをダウンロードしてOralceが動作するSolarisサーバの/var/tmpへのコピーと、Oracleユーザ環境変数の設定を行う。

unixODBCドライバのダウンロード

以下のURLからunixODBC-2.3.2.tar.gzをダウンロードする。

http://www.unixodbc.org/download.html

PostgreSQL ODBCドライバのダウンロード

以下のURLからpsqlodbc-09.06.0500.tar.gzをダウンロードする。

https://www.postgresql.org/ftp/odbc/versions/src/

oracleユーザ環境変数の設定

oralceユーザのLD_LIBRARY_PATH_64とPATHを更新する。

# su - oracle
Password:
$ vi .profile
LD_LIBRARY_PATH_64=$HOME/lib:/usr/sfw/lib/sparcv9:/usr/lib/sparcv9:/usr/postgres/8.2/lib/sparcv9:$LD_LIBRARY_PATH_64
PATH=$HOME/bin:$PATH
$ exit
# su - oracle
$

TIPS:
導入・設定および確認はoracleユーザで実行すること。

導入・設定

unixODBCのインストール

ファイルを展開する。

$ cd /var/tmp
$ gzip -d unixODBC-2.3.4.tar.gz
$ tar xvf unixODBC-2.3.4.tar
$ cd unixODBC-2.3.4

環境変数を設定する。

$ PATH=/usr/ccs/bin:/usr/sfw/bin:$PATH
$ export PATH
$ CFLAGS="-m64 -DBUILD_REAL_64_BIT_MODE"
$ export CFLAGS

コンパイル・インストールする。

$ ./configure --prefix=$HOME --enable-gui=no --enable-drivers=no
$ make
$ make install

PostgreSQL ODBCドライバのインストール

ファイルを展開する。

$ cd /var/tmp
$ gzip -d psqlodbc-09.06.0500.tar.gz
$ tar xvf psqlodbc-09.06.0500.tar.gz
$ cd psqlodbc-09.06.0500.tar.gz

コンパイル・インストールする。

$ ./configure --prefix=$HOME
$ make
$ make install

ODBC接続の設定

環境変数を設定する。

$ ODBCINI=$HOME/etc/odbc.ini
$ export ODBCINI

定義ファイルを更新する。(testdbデータベースに接続する場合)

$ vi $ODBCINI
[ODBC Data Sources]
TESTDBDSN = PostgreSQL ODBC Data Source
    
[TESTDBDSN]
Driver=/export/home/oracle/lib/psqlodbcw.so
Servername=PostgreSQLが動作するサーバのIPアドレス
Port=PostgreSQLをサービスしているポート番号(デフォルトは5432)
Database=testdb
UserName=PostgreSQLデータベース接続ユーザ
Password=PostgreSQLデータベース接続ユーザのパスワード

接続確認を行う。

$ $HOME/bin/isql -v TESTDBDSN

接続できない場合は以下のポイントを確認する。

  • odbc.iniの設定内容が正しいこと。
  • PostgreSQLが動作するサーバのfirewalld等で接続が許可されていること。

Oracle Database Gateway機能の設定

Oracle Database Gateway機能用にlistenerを追加する。

$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_TESTDB_LISTENER=
(SID_LIST =
      (SID_DESC =
       (SID_NAME=TESTDB)
      (ORACLE_HOME=/opt/oracle/product/11.2.0/db)
      (ENV="LD_LIBRARY_PATH=/export/home/oracle/lib:/opt/oracle/product/11.2.0/db/lib")
      (PROGRAM=dg4odbc)
      )
   )

TESTDB_LISTENER=
(DESCRIPTION_LIST =
      (DESCRIPTION =
         (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = Oracleが動作するサーバのIPアドレス) (PORT = Oracle Database Gateway機能をサービスするポート))
         )
      )
   )

Oracle Database Gateway機能用にtnsnamesを追加する。

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
TESTDBTNS=(DESCRIPTION=
      (ADDRESS=(PROTOCOL=tcp)(HOST=Oracleが動作するサーバのIPアドレス)(PORT=Oracle Database Gateway機能をサービスするポート))
      (CONNECT_DATA=(SID=TESTDB))
      (HS=OK)
   )

Oracle Database Gateway機能の初期化ファイルを作成する。

$ cp -p  $ORACLE_HOME/hs/admin/initdg4odbc.ora $ORACLE_HOME/hs/admin/initTESTDB.ora
$ vi $ORACLE_HOME/hs/admin/initTESTDB.ora
HS_FDS_CONNECT_INFO=TESTDBDSN
HS_FDS_TRACE_LEVEL=off
HS_FDS_SHAREABLE_NAME=/export/home/oracle/lib/libodbc.so
set ODBCINI=/export/home/oracle/etc/odbc.ini

Oracle Database Gateway機能用にlistenerを起動する。

$ lsnrctl start TESTDB_LISTENER
$ tnsping TESTDBTNS

OracleにPostgreSQLデータベースへのデータベースリンクを作成する。

$ sqlplus Oracleデータベース接続ユーザ/Oracleデータベース接続ユーザのパスワード@$ORACLE_SID
SQL> create database link TESTDBLNK connect to "PostgreSQLデータベース接続ユーザ" identified by "PostgreSQLデータベース接続ユーザのパスワード" using 'TESTDBTNS';

TIPS:
Oracleデータベース接続ユーザには以下の権限が必要。
grant connect to oracle;
grant ALTER SESSION to oracle;
grant CREATE VIEW to oracle;
grant CREATE DATABASE LINK to oracle;
grant CREATE SESSION to oracle;
grant unlimited tablespace to oracle;

確認

PostgreSQLデータベースアクセス確認

describeとselectの結果が表示されることを確認する。

$ sqlplus Oracleデータベース接続ユーザ/Oracleデータベース接続ユーザのパスワード@$ORACLE_SID
SQL> describe "PostgreSQLデータベースのテーブル名"@TESTDBLNK;
SQL> select * from "PostgreSQLデータベースのテーブル名"@TESTDBLNK where rownum <= 10;

制限事項

  • 接続先がPostgreSQLの場合、トランザクション制御が動作しない。(AUTO COMMITになる)
  • データ型が変換される。
PostgreSQL Oracle 変換理由
bigint number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
bit [(n)] long oracle側の数値データ型では取り扱っていない為、LONG型の文字列に変換が行われる。
bit varying [(n)] long oracle側の数値データ型では取り扱っていない為、LONG型の文字列に変換が行われる。
boolean long 論理地データ型をoracleでは取り扱っていない為、"真"状態に対するリテラル値を1に、"偽"状態に対するリテラル値を0に変換し、LONG型の文字列に変換が行われている。
character varying [(n)] varchar2 oracle側の文字型データであるVARCHAR2型やCHAR型に変換される。
character [(n)] char oracle側の文字型データであるVARCHAR2型やCHAR型に変換される。
date date oracle側日付/時刻データ型であるDATE型に変換される。
double precision float oracle側の浮動小数点データ型であるFLOAT型に変換される。
integer number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
interval [fields] [(p)] long oracle側に時刻を取り扱うデータ型が存在しない為、LONG型の文字列に変換が行われている。
numeric [(p, s)] number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
real float oracle側の浮動小数点データ型であるFLOAT型に変換される。
smallint number 最大値とを満たすデータ型として、oracle側ではNUMBER型に変換が行われる。
time [(p)] [without time zone] char oracle側に時刻を取り扱うデータ型が存在しない為、CHAR型の文字列に変換が行われている。
time [(p)] with time zone long oracle側に時刻を取り扱うデータ型が存在しない為、LONG型の文字列に変換が行われている。
timestamp [(p)] [without time zone] date oracle側日付/時刻データ型であるDATE型に変換される。
timestamp [(p)] with time zone date oracle側日付/時刻データ型であるDATE型に変換される。

参考

  • http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05708-01/configodbc.htm

2017年9月17日日曜日

[CentOS7] Solarisサーバのユーザ・パスワード移行検証

概要

Solaris10サーバからLinuxサーバへユーザを移行する際にパスワードも移行できるか確認する。

前提条件

  • 移行元サーバ:Solaris10
  • 移行先サーバ:CentOS7.3

検証結果

Solaris10のpasswdファイルとshadowファイルの登録内容を表示する。

[solaris10]# cat /etc/passwd | grep soluser
soluser:x:2001:2001::/export/home/soluser:/bin/sh
[solaris10]# cat /etc/shadow | grep soluser
soluser:6GGwLrUcupsbI:13300::::::

LinuxサーバのpasswdファイルとshadowファイルにSolaris10の登録内容を追加する。
ホームディレクトリは/export/homeから/homeへ変更する。
ログインシェルは/bin/shから/bin/bashへ変更する。

[centos7]# cat /etc/passwd | grep soluser
soluser:x:2001:2001::/home/soluser:/bin/bash
[centos7]# cat /etc/shadow | grep soluser
soluser:6GGwLrUcupsbI:13300::::::

一般ユーザでSolaris10から移行したユーザにスイッチできるかを確認する。

[centos7]$ su - soluser
パスワード:
最終ログイン: 2017/08/03 (木) 13:17:31 JST日時 pts/0
/usr/bin/id: cannot find name for group ID 2001
-bash-4.2$ id
uid=2001(soluser) gid=2001 groups=2001 context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
-bash-4.2$

グループの移行を忘れたためエラーは出ているが、Solaris10と同じパスワードでログインができた。

参考

  • なし。

[CentOS7] SquidでADと連携する方法

概要

CentOS6ではADと連携するために、squid_ldap_authモジュールとsquid_ldap_groupモジュールを使用していたが、CentOS7ではそれらの代わりとして、basic_ldap_authモジュールとext_ldap_group_aclモジュールを使用する。

前提条件

SSSDが設定済みでActive Directoryと連携ができていること。

参考:[CentOS7] Active Directoryとの連携にSSSDを使用する方法

NOTE:
squidとADの連携にSamba、Samba-winbindは不要。

squidの設定

ドメインコントローラに接続してユーザ名とパスワードを検証した後、ユーザがadusersグループに所属しているかを確認する。
adusersグループに所属している場合はアクセスを許可する。

# vi /etc/squid/squid.conf

~省略~

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
auth_param basic program /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f "(&(userPrincipalName=%s)(objectClass=Person))" -h win2012r2ad.test.local
auth_param basic children 5

external_acl_type ldap_group ttl=30 %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=GROUPS,DC=test,DC=local))' -h win2012r2ad.test.local -S

acl adusers_group external ldap_group adusers
http_access allow adusers_group
http_access deny all

~省略~

# systemctl restart squid

確認

basic_ldap_authモジュールとext_ldap_group_aclモジュールの確認

basic_ldap_authを実行後、ADで検証を行いたいユーザ名、パスワードを入力してEnterを押す。
OKが表示されることを確認する。

# /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f "(&(userPrincipalName=%s)(objectClass=Person))" -h win2012r2ad.test.local
ユーザ名@test.local パスワード
OK

ext_ldap_group_aclを実行後、ADで検証を行いたいユーザ名、グループを入力してEnterを押す。
OKが表示されることを確認する。

# /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=TEST,DC=LOCAL" -D "CN=LDAP検索実行ユーザ,CN=USERS,DC=TEST,DC=LOCAL" -w "LDAP検索実行ユーザのパスワード" -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=GROUPS,DC=test,DC=local))' -h win2012r2ad.test.local -S
ユーザ名 adusers
OK

TIPS:
ERRが表示される場合は-fの後に指定しているフィルタ文字列がdsgetコマンドやdsqueryで表示される値と一致していることを確認する。

C:\>dsget user "CN=aduser1,CN=USERS,DC=TEST,DC=LOCAL" -memberof
"CN=adusers,OU=GROUPS,DC=test,DC=local"
"CN=Domain Users,CN=Users,DC=test,DC=local"

C:\>dsquery * "CN=aduser1,CN=USERS,DC=TEST,DC=LOCAL" -attr *
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: aduser1
sn: aduser1
distinguishedName: CN=aduser1,CN=Users,DC=test,DC=local
instanceType: 4
whenCreated: 09/12/2017 07:57:32
whenChanged: 09/12/2017 08:11:52
displayName: aduser1
uSNCreated: 12826
memberOf: CN=adusers,OU=GROUPS,DC=test,DC=local
uSNChanged: 12838
name: aduser1
objectGUID: {71BD8F05-D759-4AE8-AE70-704952D82C2B}
userAccountControl: 66048
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 131496775071793748
lastLogoff: 0
lastLogon: 131496775128011622
pwdLastSet: 131496766523508948
primaryGroupID: 513
objectSid: S-1-5-21-2954009348-2995245008-3656725404-1106
accountExpires: 9223372036854775807
logonCount: 2
sAMAccountName: aduser1
sAMAccountType: 805306368
userPrincipalName: aduser1@test.local
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=test,DC=local
dSCorePropagationData: 09/12/2017 07:57:32
dSCorePropagationData: 01/01/1601 00:00:00
lastLogonTimestamp: 131496775128011622
ADsPath: LDAP://WIN2012R2AD.test.local/CN=aduser1,CN=Users,DC=test,DC=local

ブラウザでの確認

  • インターネット接続時にユーザ名、パスワードを入力するダイアログが表示されること。
  • adusersグループに所属しているユーザはインターネットに接続できること。
  • adusersグループに所属していないユーザはアクセスが許可されないこと。

参考

  • basic_ldap_auth(8)
  • ext_ldap_group_acl(8)

2017年9月16日土曜日

[CentOS7] SSSDのアクセス制御方法

概要

特定のグループに所属しているドメインユーザのみ、Linuxサーバへ接続可能にする。

前提条件

SSSDが設定済みでActive Directoryと連携ができていること。

参考:[CentOS7] Active Directoryとの連携にSSSDを使用する方法

方法1

realmコマンドを使用する方法

realm denyで全てのアクセスを拒否した後、realm permitでadusersのアクセスを許可する。

# realm deny --all
# realm permit --groups adusers
# systemctl restart sssd

NOTE:
sssd.confファイルが更新される。

# cat /etc/sssd/sssd.conf
access_provider = simple
simple_allow_groups = adusers

方法2

アクセス制御フィルターを使用する方法

sssd.confにad_addcess_filterを追加する。
このフィルターに一致するアカウントのみアクセスを許可する。

# vi /etc/sssd/sssd.conf
access_provider = ad
ad_access_filter = (&(objectclass=person)(memberOf=CN=adusers,OU=GROUPS,DC=test,DC=local))
# systemctl restart sssd

確認

adusersグループに所属するドメインユーザのログイン

adusersグループに所属するドメインユーザは接続できる。

# ssh -l aduser1@test.local centos2
aduser1@test.local@centos2's password:
Last login: Thu Sep 14 10:42:22 2017 from centos1
$

adusersグループに所属しないドメインユーザのログイン

adusersグループに所属しないドメインユーザはパスワード入力後、コネクションがクローズされる。

# ssh -l noaduser@test.local centos2
noaduser@test.local@centos2's password:
Connection closed by 192.168.1.2
#

参考

  • https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Windows_Integration_Guide/adding-linux-to-ad.html

2017年9月15日金曜日

[CentOS7] Active Directoryとの連携にSSSDを使用する方法

概要

LinuxサーバをADに接続する従来の方法としてSamba Winbindがある。WinbindはLinuxサーバ上でWindowsクライアントをエミュレートし、ADサーバに通信することができる。
RHEL7ではSamba WinbindとSSSDとの間に機能的な差はなくなり、SSSDはWinbindの代わりとして使用できるようになり、SSSDは、AD、RHELのIdentiry Management(IdM)、汎用的なLDAPサーバやKerberosサーバに接続する際に推奨されるコンポーネントとなった。
SSSDでは提供できないサービスとして、NT LAN Manager(NTLM)やNetBIOS名参照を使用した認証のサポートがある。これらの機能が必要となる場合はWinbindを使用する。

事前準備

ドメインコントローラの名前解決ができるようにするため、/etc/resolv.confにADサーバのDNSを設定する。

TIPS:
/etc/hostsにドメインコントローラを設定するのも可

# vi /etc/hosts
192.168.1.1    WIN2012R2AD WIN2012R2AD.test.local

導入・設定

realmdパッケージのインストール

realmdパッケージおよび、必要なパッケージをインストールする。 realmdは、Linuxサーバがドメインに接続できるように設定する簡単な方法を提供する。

# yum install realmd
# yum install sssd adcli samba-common-tools

ドメインの検出・参加

realm discoverを使用してドメインを検出する。

NOTE:
realmコマンドはDNS SRVルックアップを使用して、ドメイン内のドメインコントローラを自動的に見つける。 resolv.confにADサーバのDNSを設定していない場合は、realmコマンドに検出したいドメインのドメインコントローラを指定する。

# realm discover win2012r2ad.test.local
test.local
  type: kerberos
  realm-name: TEST.LOCAL
  domain-name: test.local
  configured: no
  server-software: active-directory
  client-software: sssd
  required-package: oddjob
  required-package: oddjob-mkhomedir
  required-package: sssd
  required-package: adcli
  required-package: samba-common-tools

realm joinを使用してドメインに参加する。

# realm join win2012r2ad.test.local -U Administrator
Administrator に対するパスワード:

NOTE:
更新されるファイルの一覧

  • /etc/krb5.conf
  • /etc/krb5.keytab
  • /etc/pam.d/smartcard-auth-ac
  • /etc/pam.d/fingerprint-auth-ac
  • /etc/pam.d/password-auth-ac
  • /etc/pam.d/postlogin-ac
  • /etc/pam.d/system-auth-ac
  • /etc/sssd/sssd.conf

確認

ドメインからユーザ情報の取得

idコマンドを使用してドメインからユーザ情報を表示する。

NOTE:
LinuxサーバのuidおよびgidはSSSDのIDマッピング機能によりActive DirectoryセキュリティID(SID)を基に作成される。 すべてのクライアントがIDマッピングにSSSDを使用する限り、マッピングの整合性は保たれるため、異なるLinuxサーバでもuidおよびgidは変わらない。

# id aduser1@test.local
uid=1218001106(aduser1@test.local) gid=1218000513(domain users@test.local) groups=1218000513(domain users@test.local),1218001602(adusers@test.local)

ドメインユーザを使用してLinuxサーバへログイン

sshコマンドを使用してドメインユーザでログインする。

# ssh -l aduser1@test.local centos2
$ id
uid=1218001106(aduser1@test.local) gid=1218000513(domain users@test.local) groups=1218000513(domain users@test.local),1218001602(adusers@test.local)
$ ls -l /home
合計 4
drwx------  4 aduser1@test.local domain users@test.local   91  9月 14 10:04 aduser1@test.local

参考

  • https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Windows_Integration_Guide/adding-linux-to-ad.html