blob: 7e0e562e18d1ebb09e8b27996cd365bead9da615 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ranger.authorization.sqoop.authorizer;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.core.ConfigurationConstants;
import org.apache.sqoop.core.SqoopConfiguration;
import org.apache.sqoop.model.MJob;
import org.apache.sqoop.model.MLink;
import org.apache.sqoop.repository.Repository;
import org.apache.sqoop.repository.RepositoryManager;
import org.apache.sqoop.security.AuthorizationManager;
import org.apache.sqoop.security.authorization.AuthorizationEngine;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
/**
*
* Here we plug the Ranger RangerSqoopAuthorizer into Sqoop.
*
* A custom RangerAdminClient is plugged into Ranger in turn, which loads security policies from a local file.
* These policies were generated in the Ranger Admin UI for a sqoop service called "sqoopTest":
*
* a) A user "sqoop" can do all permissions(contains the "read" and "write") on all connectors, any link and any job;
* b) A user "zhangqiang" can do a "read" on the connector "kafka-connector",
* and "zhangqiang" is the creator of any job and any link by mock;
* c) A user "yuwen" can do "read" and "write" on the connector "oracle-jdbc-connector" and "hdfs-connector";
* d) A user "yuwen" can do "read" and "write" on the link "oracle-link" and "hdfs-link";
* e) A user "yuwen" can do "read" and "write" on the job "oracle2hdfs-job";
*
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class RangerSqoopAuthorizerTest {
private static final List<String> allConnectors = new ArrayList<>();
private static final String SQOOP = "sqoop";
private static final String ZHANGQIANG = "zhangqiang";
private static final String YUWEN = "yuwen";
private static final String ORACLE_JDBC_CONNECTOR = "oracle-jdbc-connector";
private static final String SFTP_CONNECTOR = "sftp-connector";
private static final String KAFKA_CONNECTOR = "kafka-connector";
private static final String KITE_CONNECTOR = "kite-connector";
private static final String FTP_CONNECTOR = "ftp-connector";
private static final String HDFS_CONNECTOR = "hdfs-connector";
private static final String GENERIC_JDBC_CONNECTOR = "generic-jdbc-connector";
private static final String ORACLE_LINK = "oracle-link";
private static final String HDFS_LINK = "hdfs-link";
private static final String ORACLE2HDFS_JOB = "oracle2hdfs-job";
@BeforeClass
public static void setup() throws Exception {
// init sqoop all connectors
addAllConnectors();
// init sqoop to enable ranger authentication
initSqoopAuth();
}
@AfterClass
public static void cleanup() throws Exception {
// do nothing
}
/**
* Help function: init sqoop all connectors
*/
private static void addAllConnectors() {
allConnectors.add(ORACLE_JDBC_CONNECTOR);
allConnectors.add(SFTP_CONNECTOR);
allConnectors.add(KAFKA_CONNECTOR);
allConnectors.add(KITE_CONNECTOR);
allConnectors.add(FTP_CONNECTOR);
allConnectors.add(HDFS_CONNECTOR);
allConnectors.add(GENERIC_JDBC_CONNECTOR);
}
/**
* Help function: init sqoop to enable ranger authentication
*/
private static void initSqoopAuth() throws IOException, ClassNotFoundException, IllegalAccessException,
InstantiationException {
// init sqoop configruation
String basedir = System.getProperty("basedir");
if (basedir == null) {
basedir = new File(".").getCanonicalPath();
}
String sqoopConfigDirPath = basedir + "/src/test/resources/";
System.setProperty(ConfigurationConstants.SYSPROP_CONFIG_DIR, sqoopConfigDirPath);
SqoopConfiguration.getInstance().initialize();
// init sqoop authorization
AuthorizationManager.getInstance().initialize();
// mock sqoop class for authentication
RepositoryManager repositoryManager = mock(RepositoryManager.class);
RepositoryManager.setInstance(repositoryManager);
Repository repository = mock(Repository.class);
when(repositoryManager.getRepository()).thenReturn(repository);
MLink link = mock(MLink.class);
when(repository.findLink(anyString())).thenReturn(link);
MJob job = mock(MJob.class);
when(repository.findJob(anyString())).thenReturn(job);
// mock user "zhangqiang" as the creator of any link and any job
when(link.getCreationUser()).thenReturn(ZHANGQIANG);
when(job.getCreationUser()).thenReturn(ZHANGQIANG);
}
/**
* Help function: get random link name
*/
private String getRandomLinkName() {
return RandomStringUtils.randomAlphanumeric(10) + "-link";
}
/**
* Help function: get random job name
*/
private String getRandomJobName() {
return RandomStringUtils.randomAlphanumeric(10) + "-job";
}
// No.1 readConnector test start
/**
* sqoop read all connectors success
*/
@Test
public void readConnectorAllWithAllPermissions() {
String user = SQOOP;
for (String connector : allConnectors) {
AuthorizationEngine.readConnector(user, connector);
}
}
/**
* zhangqiang read kafka-connector success
*/
@Test
public void readConnectorKafkaWithReadPermission() {
String user = ZHANGQIANG;
String connector = KAFKA_CONNECTOR;
AuthorizationEngine.readConnector(user, connector);
}
/**
* zhangqiang read hdfs-connector failed
*/
@Test(expected = SqoopException.class)
public void readConnectorHdfsWithoutPermission() {
String user = ZHANGQIANG;
String connector = HDFS_CONNECTOR;
AuthorizationEngine.readConnector(user, connector);
}
/**
* yuwen read oracle-jdbc-connector success
*/
@Test
public void readConnectorOracleJdbcWithAllPermissions() {
String user = YUWEN;
String connector = ORACLE_JDBC_CONNECTOR;
AuthorizationEngine.readConnector(user, connector);
}
/**
* yuwen read hdfs-connector success
*/
@Test
public void readConnectorHdfsWithAllPermissions() {
String user = YUWEN;
String connector = HDFS_CONNECTOR;
AuthorizationEngine.readConnector(user, connector);
}
/**
* yuwen read kafka-connector failed
*/
@Test(expected = SqoopException.class)
public void readConnectorKafkaWithoutPermission() {
String user = YUWEN;
String connector = KAFKA_CONNECTOR;
AuthorizationEngine.readConnector(user, connector);
}
// No.1 readConnector test end
// No.2 readLink test start
/**
* sqoop read any link success
*/
@Test
public void readLinkAnyWithAllPermissions() {
String user = SQOOP;
String link = getRandomLinkName();
AuthorizationEngine.readLink(user, link);
}
/**
* zhangqiang read any link success
*/
@Test
public void readLinkAnyAsCreater() {
String user = ZHANGQIANG;
String link = getRandomLinkName();
AuthorizationEngine.readLink(user, link);
}
/**
* yuwen read oracle-link success
*/
@Test
public void readLinkOracleWithReadPermission() {
String user = YUWEN;
String link = ORACLE_LINK;
AuthorizationEngine.readLink(user, link);
}
/**
* yuwen read hdfs-link success
*/
@Test
public void readLinkHdfsWithReadPermission() {
String user = YUWEN;
String link = HDFS_LINK;
AuthorizationEngine.readLink(user, link);
}
/**
* yuwen read any link failed
*/
@Test(expected = SqoopException.class)
public void readLinkAnyWithoutPermission() {
String user = YUWEN;
String link = getRandomLinkName();
AuthorizationEngine.readLink(user, link);
}
// No.2 readLink test end
// No.3 createLink test start
/**
* sqoop create link by all connectors success
*/
@Test
public void createLinkByAllConnectorsWithAllPermissions() {
String user = SQOOP;
for (String connector : allConnectors) {
AuthorizationEngine.createLink(user, connector);
}
}
/**
* zhangqiang create link by kafka-connector success
*/
@Test
public void createLinkByKafkaConnectorWithReadPermission() {
String user = ZHANGQIANG;
String connector = KAFKA_CONNECTOR;
AuthorizationEngine.createLink(user, connector);
}
/**
* zhangqiang create link by hdfs-connector failed
*/
@Test(expected = SqoopException.class)
public void createLinkByHdfsConnectorWithoutPermission() {
String user = ZHANGQIANG;
String connector = HDFS_CONNECTOR;
AuthorizationEngine.createLink(user, connector);
}
/**
* yuwen create link by oracle-jdbc-connector success
*/
@Test
public void createLinkByOracleJdbcConnectorWithReadPermission() {
String user = YUWEN;
String connector = ORACLE_JDBC_CONNECTOR;
AuthorizationEngine.createLink(user, connector);
}
/**
* yuwen create link by hdfs-connector success
*/
@Test
public void createLinkByHdfsConnectorWithReadPermission() {
String user = YUWEN;
String connector = HDFS_CONNECTOR;
AuthorizationEngine.createLink(user, connector);
}
/**
* yuwen create link by kafka-connector failed
*/
@Test(expected = SqoopException.class)
public void createLinkByKafkaConnectorWithoutPermission() {
String user = YUWEN;
String connector = KAFKA_CONNECTOR;
AuthorizationEngine.createLink(user, connector);
}
// No.3 createLink test end
// No.4 updateLink test start
/**
* sqoop update any link created by all connectors success
*/
@Test
public void updateLinkAnyByAllConnectorsWithAllPermissions() {
String user = SQOOP;
for (String connector : allConnectors) {
String link = getRandomLinkName();
AuthorizationEngine.updateLink(user, connector, link);
}
}
/**
* zhangqiang update any link created by kafka-connector success
*/
@Test
public void updateLinkAnyByKafkaConnectorAsCreater() {
String user = ZHANGQIANG;
String connector = KAFKA_CONNECTOR;
String link = getRandomLinkName();
AuthorizationEngine.updateLink(user, connector, link);
}
/**
* zhangqiang update any link created by hdfs-connector failed
*/
@Test(expected = SqoopException.class)
public void updateLinkAnyByHdfsConnectorWithoutPermission() {
String user = ZHANGQIANG;
String connector = HDFS_CONNECTOR;
String link = getRandomLinkName();
AuthorizationEngine.updateLink(user, connector, link);
}
/**
* yuwen update link created by oracle-jdbc-connector success
*/
@Test
public void updateLinkByOracleJdbcConnectorWithWritePermission() {
String user = YUWEN;
String connector = ORACLE_JDBC_CONNECTOR;
String link = ORACLE_LINK;
AuthorizationEngine.updateLink(user, connector, link);
}
/**
* yuwen update link created by hdfs-connector success
*/
@Test
public void updateLinkByHdfsConnectorWithReadPermission() {
String user = YUWEN;
String connector = HDFS_CONNECTOR;
String link = HDFS_LINK;
AuthorizationEngine.updateLink(user, connector, link);
}
/**
* yuwen update link created by kafka-connector failed
*/
@Test(expected = SqoopException.class)
public void updateLinkByKafkaConnectorWithoutPermission() {
String user = YUWEN;
String connector = KAFKA_CONNECTOR;
String link = getRandomLinkName();
AuthorizationEngine.updateLink(user, connector, link);
}
// No.4 updateLink test end
// No.5 deleteLink test start
/**
* sqoop delete any link success
*/
@Test
public void deleteLinkAnyWithAllPermissions() {
String user = SQOOP;
String link = getRandomLinkName();
AuthorizationEngine.deleteLink(user, link);
}
/**
* zhangqiang delete any link success
*/
@Test
public void deleteLinkAnyAsCreater() {
String user = ZHANGQIANG;
String link = getRandomLinkName();
AuthorizationEngine.deleteLink(user, link);
}
/**
* yuwen delete oracle-link success
*/
@Test
public void deleteLinkOracleWithWritePermission() {
String user = YUWEN;
String link = ORACLE_LINK;
AuthorizationEngine.deleteLink(user, link);
}
/**
* yuwen delete hdfs-link success
*/
@Test
public void deleteLinkHdfsWithWritePermission() {
String user = YUWEN;
String link = HDFS_LINK;
AuthorizationEngine.deleteLink(user, link);
}
/**
* yuwen delete any link failed
*/
@Test(expected = SqoopException.class)
public void deleteLinkAnyWithoutPermission() {
String user = YUWEN;
String link = getRandomLinkName();
AuthorizationEngine.deleteLink(user, link);
}
// No.5 deleteLink test end
// No.6 enableDisableLink test start
/**
* sqoop enable disable any link success
*/
@Test
public void enableDisableLinkAnyWithAllPermissions() {
String user = SQOOP;
String link = getRandomLinkName();
AuthorizationEngine.enableDisableLink(user, link);
}
/**
* zhangqiang enable disable any link success
*/
@Test
public void enableDisableLinkAnyAsCreater() {
String user = ZHANGQIANG;
String link = getRandomLinkName();
AuthorizationEngine.enableDisableLink(user, link);
}
/**
* yuwen enable disable oracle-link success
*/
@Test
public void enableDisableLinkOracleWithWritePermission() {
String user = YUWEN;
String link = ORACLE_LINK;
AuthorizationEngine.enableDisableLink(user, link);
}
/**
* yuwen enable disable hdfs-link success
*/
@Test
public void enableDisableLinkHdfsWithWritePermission() {
String user = YUWEN;
String link = HDFS_LINK;
AuthorizationEngine.enableDisableLink(user, link);
}
/**
* yuwen enable disable any link failed
*/
@Test(expected = SqoopException.class)
public void enableDisableLinkAnyWithoutPermission() {
String user = YUWEN;
String link = getRandomLinkName();
AuthorizationEngine.enableDisableLink(user, link);
}
// No.6 enableDisableLink test end
// No.7 readJob test start
/**
* sqoop read any job success
*/
@Test
public void readJobAnyWithAllPermissions() {
String user = SQOOP;
String job = getRandomJobName();
AuthorizationEngine.readJob(user, job);
}
/**
* zhangqiang read any job success
*/
@Test
public void readJobAnyAsCreater() {
String user = ZHANGQIANG;
String job = getRandomJobName();
AuthorizationEngine.readJob(user, job);
}
/**
* yuwen read oracle2hdfs-job success
*/
@Test
public void readJobOracle2HdfsWithReadPermission() {
String user = YUWEN;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.readJob(user, job);
}
/**
* yuwen read any job failed
*/
@Test(expected = SqoopException.class)
public void readJobAnyWithoutPermission() {
String user = YUWEN;
String job = getRandomJobName();
AuthorizationEngine.readJob(user, job);
}
// No.7 readJob test end
// No.8 createJob test start
/**
* sqoop create job by any two links success
*/
@Test
public void createJobByAnyTwoLinksWithAllPermissions() {
String user = SQOOP;
String link1 = getRandomLinkName();
String link2 = getRandomLinkName();
AuthorizationEngine.createJob(user, link1, link2);
}
/**
* zhangqiang create job by any two links success
*/
@Test
public void createJobByAnyTwoLinksAsCreater() {
String user = ZHANGQIANG;
String link1 = getRandomLinkName();
String link2 = getRandomLinkName();
AuthorizationEngine.createJob(user, link1, link2);
}
/**
* yuwen create job from oracle-link to hdfs-link success
*/
@Test
public void createJobFromOracle2HdfsLinkWithReadPermission() {
String user = YUWEN;
String link1 = ORACLE_LINK;
String link2 = HDFS_LINK;
AuthorizationEngine.createJob(user, link1, link2);
}
/**
* yuwen create job from oracle-link to any link failed
*/
@Test(expected = SqoopException.class)
public void createJobFromOracle2AnyLinkWithoutPermission() {
String user = YUWEN;
String link1 = ORACLE_LINK;
String link2 = getRandomLinkName();
AuthorizationEngine.createJob(user, link1, link2);
}
/**
* yuwen create job by any two links failed
*/
@Test(expected = SqoopException.class)
public void createJobByAnyTwoLinksWithoutPermission() {
String user = YUWEN;
String link1 = getRandomLinkName();
String link2 = getRandomLinkName();
AuthorizationEngine.createJob(user, link1, link2);
}
// No.8 createJob test end
// No.9 updateJob test start
/**
* sqoop update any job created by any two links success
*/
@Test
public void updateJobAnyByAnyTwoLinksWithAllPermissions() {
String user = SQOOP;
String link1 = getRandomLinkName();
String link2 = getRandomLinkName();
String job = getRandomJobName();
AuthorizationEngine.updateJob(user, link1, link2, job);
}
/**
* zhangqiang update any job created by any two links success
*/
@Test
public void updateJobAnyByAnyTwoLinksAsCreater() {
String user = ZHANGQIANG;
String link1 = getRandomLinkName();
String link2 = getRandomLinkName();
String job = getRandomJobName();
AuthorizationEngine.updateJob(user, link1, link2, job);
}
/**
* yuwen update oracle2hdfs-job created from oracle-link to hdfs-link
* success
*/
@Test
public void updateJobOracle2HdfsByTwoLinksWithWritePermission() {
String user = YUWEN;
String link1 = ORACLE_LINK;
String link2 = HDFS_LINK;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.updateJob(user, link1, link2, job);
}
/**
* yuwen update oracle2hdfs-job created from new_oracle-link to hdfs-link
* failed
*/
@Test(expected = SqoopException.class)
public void updateJobOracle2HdfsByTwoLinksWithoutPermission() {
String user = YUWEN;
String link1 = "new_" + ORACLE_LINK;
String link2 = HDFS_LINK;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.updateJob(user, link1, link2, job);
}
/**
* yuwen update any job created from oracle-link to hdfs-link failed
*/
@Test(expected = SqoopException.class)
public void updateJobAnyByTwoLinksWithoutPermission() {
String user = YUWEN;
String link1 = ORACLE_LINK;
String link2 = HDFS_LINK;
String job = getRandomJobName();
AuthorizationEngine.updateJob(user, link1, link2, job);
}
/**
* yuwen update any job created from oracle-link to hdfs-link failed
*/
@Test(expected = SqoopException.class)
public void updateJobAnyByAnyLinksWithoutPermission() {
String user = YUWEN;
String link1 = getRandomLinkName();
String link2 = getRandomLinkName();
String job = getRandomJobName();
AuthorizationEngine.updateJob(user, link1, link2, job);
}
// No.9 updateJob test end
// No.10 deleteJob test start
/**
* sqoop delete any job success
*/
@Test
public void deleteJobAnyWithAllPermissions() {
String user = SQOOP;
String job = getRandomJobName();
AuthorizationEngine.deleteJob(user, job);
}
/**
* zhangqiang delete any job success
*/
@Test
public void deleteJobAnyAsCreater() {
String user = ZHANGQIANG;
String job = getRandomJobName();
AuthorizationEngine.deleteJob(user, job);
}
/**
* yuwen delete oracle2hdfs-job success
*/
@Test
public void deleteJobOracle2HdfsWithWritePermission() {
String user = YUWEN;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.deleteJob(user, job);
}
/**
* yuwen delete any job failed
*/
@Test(expected = SqoopException.class)
public void deleteJobAnyWithoutPermission() {
String user = YUWEN;
String job = getRandomJobName();
AuthorizationEngine.deleteJob(user, job);
}
// No.10 deleteJob test end
// No.11 enableDisableJob test start
/**
* sqoop enable disable any job success
*/
@Test
public void enableDisableJobAnyWithAllPermissions() {
String user = SQOOP;
String job = getRandomJobName();
AuthorizationEngine.enableDisableJob(user, job);
}
/**
* zhangqiang enable disable any job success
*/
@Test
public void enableDisableJobAnyAsCreater() {
String user = ZHANGQIANG;
String job = getRandomJobName();
AuthorizationEngine.enableDisableJob(user, job);
}
/**
* yuwen enable disable oracle2hdfs-job success
*/
@Test
public void enableDisableJobOracle2HdfsWithWritePermission() {
String user = YUWEN;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.enableDisableJob(user, job);
}
/**
* yuwen enable disable any job failed
*/
@Test(expected = SqoopException.class)
public void enableDisableJobAnyWithoutPermission() {
String user = YUWEN;
String job = getRandomJobName();
AuthorizationEngine.enableDisableJob(user, job);
}
// No.11 enableDisableJob test end
// No.12 startJob test start
/**
* sqoop start any job success
*/
@Test
public void startJobAnyWithAllPermissions() {
String user = SQOOP;
String job = getRandomJobName();
AuthorizationEngine.startJob(user, job);
}
/**
* zhangqiang start any job success
*/
@Test
public void startJobAnyAsCreater() {
String user = ZHANGQIANG;
String job = getRandomJobName();
AuthorizationEngine.startJob(user, job);
}
/**
* yuwen start oracle2hdfs-job success
*/
@Test
public void startJobOracle2HdfsWithWritePermission() {
String user = YUWEN;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.startJob(user, job);
}
/**
* yuwen start any job failed
*/
@Test(expected = SqoopException.class)
public void startJobAnyWithoutPermission() {
String user = YUWEN;
String job = getRandomJobName();
AuthorizationEngine.startJob(user, job);
}
// No.12 startJob test end
// No.13 stopJob test start
/**
* sqoop stop any job success
*/
@Test
public void stopJobAnyWithAllPermissions() {
String user = SQOOP;
String job = getRandomJobName();
AuthorizationEngine.stopJob(user, job);
}
/**
* zhangqiang start any job success
*/
@Test
public void stopJobAnyAsCreater() {
String user = ZHANGQIANG;
String job = getRandomJobName();
AuthorizationEngine.stopJob(user, job);
}
/**
* yuwen stop oracle2hdfs-job success
*/
@Test
public void stopJobOracle2HdfsWithWritePermission() {
String user = YUWEN;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.stopJob(user, job);
}
/**
* yuwen stop any job failed
*/
@Test(expected = SqoopException.class)
public void stopJobAnyWithoutPermission() {
String user = YUWEN;
String job = getRandomJobName();
AuthorizationEngine.stopJob(user, job);
}
// No.13 stopJob test end
// No.14 statusJob test start
/**
* sqoop status any job success
*/
@Test
public void statusJobAnyWithAllPermissions() {
String user = SQOOP;
String job = getRandomJobName();
AuthorizationEngine.statusJob(user, job);
}
/**
* zhangqiang status any job success
*/
@Test
public void statusJobAnyAsCreater() {
String user = ZHANGQIANG;
String job = getRandomJobName();
AuthorizationEngine.statusJob(user, job);
}
/**
* yuwen status oracle2hdfs-job success
*/
@Test
public void statusJobOracle2HdfsWithReadPermission() {
String user = YUWEN;
String job = ORACLE2HDFS_JOB;
AuthorizationEngine.statusJob(user, job);
}
/**
* yuwen status status job failed
*/
@Test(expected = SqoopException.class)
public void statusJobAnyWithoutPermission() {
String user = YUWEN;
String job = getRandomJobName();
AuthorizationEngine.statusJob(user, job);
}
// No.14 statusJob test end
}