Contenu

Introduction

Conditions préalables

Conditions requises

Components Used

Configuration

Étape 1. Configuration de base de MS SQL

Étape 2. Configuration de base d'ISE

Étape 3. Configurer l'authentification utilisateur

Étape 4. Configurer la récupération de groupe

Étape 5. Configurer la récupération des attributs

Dépannage

Introduction

Ce document décrit comment configurer Identity Services Engine (ISE) avec Microsoft Standard Query Language (SQL) Server pour l'authentification ISE à l'aide d'Open Database Connectivity (ODBC)

Note: L'authentification ODBC (Open Database Connectivity) nécessite ISE pour pouvoir récupérer un mot de passe utilisateur en texte clair. Le mot de passe peut être chiffré dans la base de données, mais doit être déchiffré par la procédure stockée.

Conditions préalables

Conditions requises

Cisco vous recommande de prendre connaissance des rubriques suivantes :

- Concepts de base de données et ODBC

- Microsoft SQL Server

Components Used

Les informations contenues dans ce document sont basées sur les versions de matériel et de logiciel suivantes :

- Identity Services Engine 2.1

- MSSQL Server 2008 R2

Configuration

Étape 1. Configuration de base de MS SQL

Les étapes de configuration incluent la création d'une base de données et d'un utilisateur pour ISE avec des autorisations d'accès à cette base de données.

Note: ISE prend uniquement en charge l'authentification SQL, et non le compte Windows. Si vous devez modifier le mode d'authentification, reportez-vous à Modifier le mode d'authentification du serveur.

1. Ouvrez SQL Server Management Studio (menu Démarrer > Microsoft SQL Server 2008 R2) et créez une base de données :

2. Laissez les options par défaut ou ajustez les paramètres de base de données comme indiqué dans cette image :

3. Créez un utilisateur et définissez les autorisations comme indiqué dans les images ci-dessous :

Étape 2. Configuration de base d'ISE

Créez une source d'identité ODBC à Administration > Source d'identité externe > ODBC et testez la connexion :

Étape 3. Configurer l'authentification utilisateur

L'authentification ISE vers ODBC utilise des procédures stockées.La procédure stockée pour l'authentification renvoie le jeu de résultats avec cette syntaxe :

Valeur

Type

Résultat

Entier

Groupe (pour la compatibilité avec ACS 4.2 uniquement)

Entier ou varchar(255)

Informations sur le compte

varchar(255)

Chaîne d'erreur

varchar(255)

Pour d'autres procédures, reportez-vous au Guide d'administration de Cisco Identity Services Engine 2.1

Astuce : Il est possible de retourner des paramètres nommés au lieu du jeu de résultats. C'est juste un type de sortie différent, la fonctionnalité est la même.

1. Naviguez jusqu'aux options et décochez la case Empêcher l'enregistrement des modifications nécessitant une recréation de la table (facultatif) :

2. Créez la table. Assurez-vous de définir les paramètres d'identité sur la clé primaire. Pour définir user_id comme clé primaire, cliquez avec le bouton droit sur le nom de colonne :

SQL final :

CREATE TABLE [dbo].[ISE_Users](

[user_id] [int] IDENTITY(1,1) NOT NULL,

[username] [varchar](max) NOT NULL,

[password] [varchar](max) NOT NULL,

CONSTRAINT [PK_ISE_Users] PRIMARY KEY CLUSTERED

(

[user_id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

3. Exécutez cette requête pour insérer un utilisateur :

insert into ISE_Users(username,password) values('odbcuser1','odbcpass');

4. Créez une procédure pour l'authentification par mot de passe en texte brut (utilisée pour PAP, méthode interne EAP-GTC, TACACS) :

CREATE PROCEDURE [dbo].[ISEAuthUserPlainReturnsRecordset]

@username varchar(255), @password varchar(255)

AS

BEGIN

IF EXISTS( SELECT username

FROM ISE_Users

WHERE username = @username

AND password = @password )

SELECT 0,11,'This is a very good user, give him all access','No Error'

FROM ISE_Users

WHERE username = @username

ELSE

SELECT 3,0,'odbc','ODBC Authen Error'

END

5. Créez une procédure pour l'extraction du mot de passe en texte brut (utilisée pour CHAP, MSCHAPv1/v2, EAP-MD5, LEAP, méthode interne EAP-MSCHAPv2, TACACS) :

CREATE PROCEDURE [dbo].[ISEFetchPasswordReturnsRecordset]

@username varchar(255)

AS

BEGIN

IF EXISTS( SELECT username

FROM ISE_Users

WHERE username = @username)

SELECT 0,11,'This is a very good user, give him all access','No Error',password

FROM ISE_Users

WHERE username = @username

ELSE

SELECT 3,0,'odbc','ODBC Authen Error'

END

6. Créer une procédure pour vérifier l'existence d'un nom d'utilisateur ou d'une machine (utilisée pour MAB, reconnexion rapide de PEAP, EAP-FAST et EAP-TTLS) :

CREATE PROCEDURE [dbo].[ISEUserLookupReturnsRecordset]

@username varchar(255)

AS

BEGIN

IF EXISTS( SELECT username

FROM ISE_Users

WHERE username = @username)

SELECT 0,11,'This is a very good user, give him all access','No Error'

FROM ISE_Users

WHERE username = @username

ELSE

SELECT 3,0,'odbc','ODBC Authen Error'

END

7. Tester les procédures créées :

Tester d'autres procédures de la même manière.

8. Configurez les procédures sur ISE et enregistrez :

9. Créez une règle d'authentification simple à l'aide d'ODBC et testez-la :

b3560#test aaa group ISE236 odbcuser1 odbcpass legacy

Attempting authentication test to server-group ISE236 using radius

User was successfully authenticated.

Étape 4. Configurer la récupération de groupe

1. Créez des tables contenant des groupes d'utilisateurs et une autre table utilisée pour le mappage de plusieurs à plusieurs :

CREATE TABLE [dbo].[Groups](

[Group_ID] [int] IDENTITY(1,1) NOT NULL,

[Group_Name] [varchar](max) NOT NULL,

[Group_Desc] [text] NOT NULL,

CONSTRAINT [PK_Groups] PRIMARY KEY CLUSTERED

(

[Group_ID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMAR

CREATE TABLE [dbo].[User_Groups_Mapping](

[user_id] [int] NOT NULL,

[group_id] [int] NOT NULL

) ON [PRIMARY]

ALTER TABLE dbo.User_Groups_Mapping ADD CONSTRAINT

FK_User_Groups_Mapping_Groups FOREIGN KEY

(

group_id

) REFERENCES dbo.Groups

(

Group_ID

) ON UPDATE CASCADE

ON DELETE CASCADE

GO

ALTER TABLE dbo.User_Groups_Mapping ADD CONSTRAINT

FK_User_Groups_Mapping_ISE_Users FOREIGN KEY

(

user_id

) REFERENCES dbo.ISE_Users

(

user_id

) ON UPDATE CASCADE

ON DELETE CASCADE

2. Ajoutez des groupes et des mappages de sorte que ODBCUSER1 appartient aux deux groupes :

INSERT [dbo].[Groups] ([Group_ID], [Group_Name], [Group_Desc]) VALUES (1, N'ODBCGroup1', N'My Nice Group1')

INSERT [dbo].[User_Groups_Mapping] ([user_id], [group_id]) VALUES (1, 1)

INSERT [dbo].[Groups] ([Group_ID], [Group_Name], [Group_Desc]) VALUES (2, N'ODBCGroup2', N'My Nice Group2')

INSERT [dbo].[User_Groups_Mapping] ([user_id], [group_id]) VALUES (1, 2)

3. Créer une procédure de récupération de groupe :

CREATE PROCEDURE [dbo].[ISEGroupsRetrieval]

@username varchar(255), @result int output

AS

BEGIN

if exists (select * from ISE_Users where username = @username)

begin

set @result = 0

select Group_Name from Groups where group_id in (select group_ID from User_Groups_Mapping where User_Groups_Mapping.USER_ID IN (select USER_ID from ISE_Users where username=@username ) )

end

else

set @result = 1

END

4. Mapper à Récupérer les groupes :

5. Récupérez les groupes et ajoutez-les à la source d'identité ODBC :

6. Ajoutez un autre utilisateur qui n'appartient à aucun groupe :

insert into ISE_Users(username,password) values('odbcuser2','odbcpass');

7. Créer un ensemble de stratégies spécifique et tester :

b3560#test aaa group ISE236 odbcuser2 odbcpass legacy

Attempting authentication test to server-group ISE236 using radius

User authentication request was rejected by server.

b3560#test aaa group ISE236 odbcuser1 odbcpass legacy

Attempting authentication test to server-group ISE236 using radius

User was successfully authenticated.

Étape 5. Configurer la récupération des attributs

1. Afin de simplifier cet exemple, une table plate est utilisée pour les attributs :

CREATE TABLE [dbo].[User_Attributes](

[user_id] [int] NOT NULL,

[Attribute_Name] [varchar](max) NOT NULL,

[Attribute_Value] [varchar](max) NOT NULL

) ON [PRIMARY]

GO

ALTER TABLE [dbo].[User_Attributes] WITH CHECK ADD CONSTRAINT [FK_User_Attributes_ISE_Users] FOREIGN KEY([user_id])

REFERENCES [dbo].[ISE_Users] ([user_id])

ON UPDATE CASCADE

ON DELETE CASCADE

GO

2. Créez un attribut pour l'un des utilisateurs :

INSERT [dbo].[User_Attributes] ([user_id], [Attribute_Name], [Attribute_Value]) VALUES (2, N'AwsomenessLevel', N'100')

INSERT [dbo].[User_Attributes] ([user_id], [Attribute_Name], [Attribute_Value]) VALUES (2, N'UserType', N'admin')

3. Créer une procédure stockée :

CREATE PROCEDURE [dbo].[ISEAttrsRetrieval]

@username varchar(255), @result int output

AS

BEGIN

if exists (select * from ISE_Users where username = @username)

begin

set @result = 0

select attribute_name , attribute_value from user_attributes where USER_ID in(SELECT USER_ID from ISE_Users where username = @username)

end

else

set @result = 1

END

4. Mapper les attributs de récupération :

5. Récupère les attributs :

6. Ajuster les règles ISE :

Dépannage

Si la connexion échoue, vérifiez le journal des événements de windows. Sur ISE, utilisez la commande show logging application prrt-management.log tail lors de la tentative de connexion.

Exemple de mode d'authentification incorrect :

bise236/admin# sh logg app prrt-management.log tail

2016-06-08 09:03:59,822 WARN [admin-http-pool177][] cisco.cpm.odbcidstore.impl.MSSQLServerDbAccess -:bastien::- Connection to ODBC DB failed. Exception: com.microsoft.sqlserver.jdbc.S

QLServerException: Login failed for user 'babaland\administrator'. ClientConnectionId:c74ade15-4f34-415a-9a94-4c54c58c0fc3

com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'babaland\administrator'. ClientConnectionId:c74ade15-4f34-415a-9a94-4c54c58c0fc3

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)

at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:254)

at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:84)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2908)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2234)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)

at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2220)

at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1326)

Exemple d'autorisations manquantes de l'utilisateur pour ouvrir la base de données :

2016-06-08 09:13:57,842 WARN [admin-http-pool159][] cisco.cpm.odbcidstore.impl.MSSQLServerDbAccess -:bastien::- Connection to ODBC DB failed. Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot open database "ISEDB" requested by the login. The login failed. ClientConnectionId:299c2956-6946-4282-b3ca-2aa86642a821

com.microsoft.sqlserver.jdbc.SQLServerException: Cannot open database "ISEDB" requested by the login. The login failed. ClientConnectionId:299c2956-6946-4282-b3ca-2aa86642a821

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)

at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:254)

at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:84)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2908)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2234)

at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)

Afin de dépanner les opérations de base de données, activez les composants de journalisation odbc-id-store au niveau DEBUG sous Administration > System > Logging > Debug Log Configuation.

Les journaux sont placés dans le fichier prrt-management.log.

Exemple pour odbuser2 :

2016-06-08 12:26:56,009 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Authenticate Plain Text Password. Username=odbcuser2, SessionID=0a3027ecLA_rJLKsS5QAzuRvluGWzdYe67rIgcG3MMQcpE8yKnw

2016-06-08 12:26:56,012 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24852

2016-06-08 12:26:56,012 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - get connection

2016-06-08 12:26:56,012 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - use existing connection

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - connections in use: 1

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Authenticate plain text password

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Prepare stored procedure call, procname=ISEAuthUserPlainReturnsRecordset

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Using recordset to obtain stored procedure result values

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24855

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Text: {call ISEAuthUserPlainReturnsRecordset(?, ?)}

2016-06-08 12:26:56,013 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Setup stored procedure input parameters, username=odbcuser2, password=***

2016-06-08 12:26:56,014 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Execute stored procedure call

2016-06-08 12:26:56,017 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Process stored procedure results

2016-06-08 12:26:56,017 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Obtain stored procedure results from recordset

2016-06-08 12:26:56,017 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Received result recordset, number of columns=4

2016-06-08 12:26:56,017 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Results successfully parsed from recordset

2016-06-08 12:26:56,018 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - release connection

2016-06-08 12:26:56,018 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - connections in use: 0

2016-06-08 12:26:56,018 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- Call to ODBC DB succeeded

2016-06-08 12:26:56,018 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.OdbcAuthResult -:::- Authentication result: code=0, Conection succeeded=false, odbcDbErrorString=No Error, odbcStoredProcedureCustomerErrorString=null, accountInfo=This is a very good user, give him all access, group=11

2016-06-08 12:26:56,019 DEBUG [Thread-4051][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24853

2016-06-08 12:26:56,026 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Get all user groups. Username=odbcuser2, SessionID=0a3027ecLA_rJLKsS5QAzuRvluGWzdYe67rIgcG3MMQcpE8yKnw

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Fetch user groups. Username=odbcuser2, SessionID=0a3027ecLA_rJLKsS5QAzuRvluGWzdYe67rIgcG3MMQcpE8yKnw

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24869

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - get connection

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - use existing connection

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - connections in use: 1

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Fetch user groups

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Prepare stored procedure call, procname=ISEGroupsRetrieval

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Text: {call ISEGroupsRetrieval(?,?)}

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Setup stored procedure input parameters, username=odbcuser2

2016-06-08 12:26:56,029 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Execute stored procedure call

2016-06-08 12:26:56,031 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Process stored procedure results

2016-06-08 12:26:56,032 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Received epmty result set, no groups/attributes data can be obtained

2016-06-08 12:26:56,032 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Result code indicates success

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - release connection

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - connections in use: 0

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- Call to ODBC DB succeeded

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24870

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Get all user groups. Got groups...

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Get all user groups. Username=odbcuser2, ExternalGroups=[]

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Fetch user attributes. Username=odbcuser2, SessionID=0a3027ecLA_rJLKsS5QAzuRvluGWzdYe67rIgcG3MMQcpE8yKnw

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24872

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - get connection

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - use existing connection

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - connections in use: 1

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Fetch user attributes

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Prepare stored procedure call, procname=ISEAttrsRetrieval

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Text: {call ISEAttrsRetrieval(?,?)}

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Setup stored procedure input parameters, username=odbcuser2

2016-06-08 12:26:56,033 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Execute stored procedure call

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Process stored procedure results

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Received result recordset, total number of columns=2

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- According to column number expect multiple rows (vertical attributes/groups retured result)

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Fetched data: AwsomenessLevel=100

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Fetched data: UserType=admin

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Results successfully parsed from recordset

2016-06-08 12:26:56,035 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnection -:::- Result code indicates success

2016-06-08 12:26:56,036 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - release connection

2016-06-08 12:26:56,036 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcConnectionPool -:::- OdbcConnectionPool - connections in use: 0

2016-06-08 12:26:56,036 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- Call to ODBC DB succeeded

2016-06-08 12:26:56,036 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.CustomerLog -:::- Write customer log message: 24873

2016-06-08 12:26:56,036 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Get all user attrs. Username=odbcuser2, Setting ISE_ODBC.AwsomenessLevel to 100

2016-06-08 12:26:56,036 DEBUG [Thread-84][] cisco.cpm.odbcidstore.impl.OdbcIdStore -:::- ODBC ID Store Operation: Get all user attrs. Username=odbcuser2, Setting ISE_ODBC.UserType to admin