/* * JBoss, Home of Professional Open Source. * Copyright 2014, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.test.integration.security.common; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CORE_SERVICE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VAULT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VAULT_OPTIONS; import java.io.File; import java.util.Iterator; import java.util.Set; import org.jboss.as.arquillian.api.ServerSetupTask; import org.jboss.as.arquillian.container.ManagementClient; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.client.OperationBuilder; import org.jboss.as.controller.operations.common.Util; import org.jboss.as.security.vault.VaultSession; import org.jboss.dmr.ModelNode; import org.jboss.logging.Logger; /** * Basic Vault ServerSetupTask which add new vault and store attribute for block "someVaultBlock" and attribute name * "someAttributeName" with attribute value "secretValue" * * @author olukas * */ public class BasicVaultServerSetupTask implements ServerSetupTask { private static Logger LOGGER = Logger.getLogger(BasicVaultServerSetupTask.class); private ModelNode originalVault; private VaultSession nonInteractiveSession; public static final String ATTRIBUTE_NAME = "someAttributeName"; public static final String VAULT_BLOCK = "someVaultBlock"; public static final String VAULT_ATTRIBUTE = "secretValue"; public static final String VAULTED_PROPERTY = "${VAULT::" + VAULT_BLOCK + "::" + ATTRIBUTE_NAME + "::1}"; public static final String VAULT_PASSWORD = "VaultPassword"; public static final String VAULT_ALIAS = "VaultAlias"; static final String KEY_STORE_FILE = "myVault.keystore"; static final String RESOURCE_LOCATION = ""; static final PathAddress VAULT_PATH = PathAddress.pathAddress().append(CORE_SERVICE, VAULT); private VaultHandler vaultHandler; private String externalVaultPassword = null; @Override public void setup(ManagementClient managementClient, String containerId) throws Exception { // clean directory and keystore VaultHandler.cleanFilesystem(RESOURCE_LOCATION, false, KEY_STORE_FILE); // create vault keystore vaultHandler = new VaultHandler(KEY_STORE_FILE, VAULT_PASSWORD, null, RESOURCE_LOCATION, 128, VAULT_ALIAS, "87654321", 20); ModelNode op = new ModelNode(); // save original vault setting LOGGER.trace("Saving original vault setting"); op = Util.getReadAttributeOperation(VAULT_PATH, VAULT_OPTIONS); originalVault = (managementClient.getControllerClient().execute(new OperationBuilder(op).build())).get(RESULT); // remove original vault if (originalVault.get("KEYSTORE_URL") != null && originalVault.hasDefined("KEYSTORE_URL")) { op = Util.createRemoveOperation(VAULT_PATH); CoreUtils.applyUpdate(op, managementClient.getControllerClient()); } // create new vault LOGGER.trace("Creating new vault"); String keystoreURL = vaultHandler.getKeyStore(); String encryptionDirectory = new File(RESOURCE_LOCATION).getAbsolutePath(); String salt = "87654321"; int iterationCount = 20; nonInteractiveSession = new VaultSession(keystoreURL, VAULT_PASSWORD, encryptionDirectory, salt, iterationCount); nonInteractiveSession.startVaultSession(VAULT_ALIAS); // create security attributes LOGGER.trace("Inserting attribute " + VAULT_ATTRIBUTE + " to vault"); nonInteractiveSession.addSecuredAttribute(VAULT_BLOCK, ATTRIBUTE_NAME, VAULT_ATTRIBUTE.toCharArray()); // create new vault setting in standalone op = Util.createAddOperation(VAULT_PATH); ModelNode vaultOption = op.get(VAULT_OPTIONS); vaultOption.get("KEYSTORE_URL").set(keystoreURL); if (externalVaultPassword != null) { vaultOption.get("KEYSTORE_PASSWORD").set(externalVaultPassword); } else { vaultOption.get("KEYSTORE_PASSWORD").set(nonInteractiveSession.getKeystoreMaskedPassword()); } vaultOption.get("KEYSTORE_ALIAS").set(VAULT_ALIAS); vaultOption.get("SALT").set(salt); vaultOption.get("ITERATION_COUNT").set(Integer.toString(iterationCount)); vaultOption.get("ENC_FILE_DIR").set(encryptionDirectory); CoreUtils.applyUpdate(op, managementClient.getControllerClient()); LOGGER.debug("Vault created in server configuration"); } @Override public void tearDown(ManagementClient managementClient, String containerId) throws Exception { ModelNode op; op = Util.createRemoveOperation(VAULT_PATH); CoreUtils.applyUpdate(op, managementClient.getControllerClient()); // set original vault if (originalVault.get("KEYSTORE_URL") != null && originalVault.hasDefined("KEYSTORE_URL")) { Set<String> originalVaultParam = originalVault.keys(); Iterator<String> it = originalVaultParam.iterator(); op = Util.createAddOperation(VAULT_PATH); ModelNode vaultOption = op.get(VAULT_OPTIONS); while (it.hasNext()) { String param = (String) it.next(); vaultOption.get(param).set(originalVault.get(param)); } CoreUtils.applyUpdate(op, managementClient.getControllerClient()); } // remove vault files vaultHandler.cleanUp(); } protected void setExternalVaultPassword(String externalVaultPassword) { this.externalVaultPassword = externalVaultPassword; } }