[SR-Users] "kamdbctl create" failing with MySQL 8

Jonathan Tyler jonathan.tyler at basement.cloud
Wed Nov 21 17:12:34 CET 2018


Thank you Henning :)

After looking at the output, I noticed it was ignoring $DBACCESSHOST, so I modified kamdbctl.mysql moving it up to the top as follows...

kamailio_db_grant () # pars: <database name>
{
	if [ $# -ne 1 ] ; then
		merr "kamailio_db_grant function takes one param"
		exit 1
	fi

	minfo "granting privileges to database $1 ..."

	# Users: kamailio is the regular user, kamailioro only for reading
	if [ ! -z "$DBACCESSHOST" ] ; then
		sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '$DBRWUSER'@'$DBACCESSHOST' IDENTIFIED BY '$DBRWPW';
			GRANT SELECT ON $1.* TO '$DBROUSER'@'$DBACCESSHOST' IDENTIFIED BY '$DBROPW';"
		if [ $? -ne 0 ] ; then
			merr "granting access host privileges to database $1 failed!"
			exit 1
		fi
	elif [ "$DBHOST" != "localhost" ] ; then
		sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '$DBRWUSER'@'localhost' IDENTIFIED  BY '$DBRWPW';
			GRANT SELECT ON $1.* TO '$DBROUSER'@'localhost' IDENTIFIED BY '$DBROPW';"
		if [ $? -ne 0 ] ; then
			merr "granting localhost privileges to database $1 failed!"
			exit 1
		fi
	else
		sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '${DBRWUSER}'@'$DBHOST' IDENTIFIED BY '$DBRWPW';
			GRANT SELECT ON $1.* TO '${DBROUSER}'@'$DBHOST' IDENTIFIED BY '$DBROPW';"

		if [ $? -ne 0 ] ; then
			merr "granting privileges to database $1 failed!"
			exit 1
		fi
	fi

}

But, I'm still getting the same error.

## INFO: granting privileges to database kamailio ...
## + '[' '!' -z % ']'
## + sql_query '' 'GRANT ALL PRIVILEGES ON kamailio.* TO '\''_kamailio'\''@'\''%'\'' IDENTIFIED BY '\''<rw-password>'\'';
##                         GRANT SELECT ON kamailio.* TO '\''_kamailio-ro'\''@'\''%'\'' IDENTIFIED BY '\''<ro-password>'\'';'
## + '[' 2 -gt 1 ']'
## + '[' -n '' ']'
## + DB=
## + shift
## + '[' -n <admin-password> ']'
## + mysql -h <db-host> -P 3306 -u<user> -p<admin-password> -e 'GRANT ALL PRIVILEGES ON kamailio.* TO '\''_kamailio'\''@'\''%'\'' IDENTIFIED BY '\''<rw-password>'\'';
##                         GRANT SELECT ON kamailio.* TO '\''_kamailio-ro'\''@'\''%'\'' IDENTIFIED BY '\''<ro-password>'\'';'
## mysql: [Warning] Using a password on the command line interface can be insecure.
## ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '<rw-password>'' at line 1
## + '[' 1 -ne 0 ']'
## + merr 'granting access host privileges to database kamailio failed!'
## + '[' -t 1 -a -z '' ']'
## + echo -e '\E[37;31m\033[1mERROR: granting access host privileges to database kamailio failed!\033[0m'

I loaded the query into Workbench and it told me "'_kamailio' is not valid at this position for this server version, expecting an identifier".
That lead me to read up on the correct syntax for GRANT and apparently you can't have "IDENTIFIED BY" in the GRANT query with MySQL 8. The account must be created first.

Here's my changes to kamdbctl.mysql that are now working...

kamailio_db_create () # pars: <database name>
{
	if [ $# -ne 1 ] ; then
		merr "kamailio_db_create function takes one param"
		exit 1
	fi

	if [ "$CHARSET" = "" ]; then
		minfo "test server charset"
		db_charset_test
	fi

	minfo "creating database $1 and users $DBRWUSER, $DBROUSER ..."

	if [ ! -z "$DBACCESSHOST" ] ; then
		sql_query "" "CREATE DATABASE $1 CHARACTER SET $CHARSET;
			CREATE USER '$DBRWUSER'@'$DBACCESSHOST' IDENTIFIED BY '$DBRWPW';
			CREATE USER '$DBROUSER'@'$DBACCESSHOST' IDENTIFIED BY '$DBROPW';
			FLUSH PRIVILEGES;"
		if [ $? -ne 0 ] ; then
			merr "Creating database $1 on access host failed!"
			exit 1
		fi
	elif [ "$DBHOST" != "localhost" ] ; then
		sql_query "" "CREATE DATABASE $1 CHARACTER SET $CHARSET;
			CREATE USER '$DBRWUSER'@'$DBHOST' IDENTIFIED BY '$DBRWPW';
			CREATE USER '$DBROUSER'@'$DBHOST' IDENTIFIED BY '$DBROPW';
			FLUSH PRIVILEGES;"
		if [ $? -ne 0 ] ; then
			merr "Creating database $1 on localhost failed!"
			exit 1
		fi
	else
		sql_query "" "CREATE DATABASE $1 CHARACTER SET $CHARSET;
			CREATE USER '$DBRWUSER'@'localhost' IDENTIFIED BY '$DBRWPW';
			CREATE USER '$DBROUSER'@'localhost' IDENTIFIED BY '$DBROPW';
			FLUSH PRIVILEGES;"
		if [ $? -ne 0 ] ; then
			merr "Creating database $1 failed!"
			exit 1
		fi
	fi
}

kamailio_db_grant () # pars: <database name>
{
	if [ $# -ne 1 ] ; then
		merr "kamailio_db_grant function takes one param"
		exit 1
	fi

	minfo "granting privileges to database $1 ..."

	# Users: kamailio is the regular user, kamailioro only for reading
	if [ ! -z "$DBACCESSHOST" ] ; then
		sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '$DBRWUSER'@'$DBACCESSHOST';
			GRANT SELECT ON $1.* TO '$DBROUSER'@'$DBACCESSHOST';
			FLUSH PRIVILEGES;"
		if [ $? -ne 0 ] ; then
			merr "granting access host privileges to database $1 failed!"
			exit 1
		fi
	elif [ "$DBHOST" != "localhost" ] ; then
		sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '$DBRWUSER'@'localhost';
			GRANT SELECT ON $1.* TO '$DBROUSER'@'localhost';
			FLUSH PRIVILEGES;"
		if [ $? -ne 0 ] ; then
			merr "granting localhost privileges to database $1 failed!"
			exit 1
		fi
	else
		sql_query "" "GRANT ALL PRIVILEGES ON $1.* TO '${DBRWUSER}'@'$DBHOST';
			GRANT SELECT ON $1.* TO '$DBROUSER'@'$DBHOST';
			FLUSH PRIVILEGES;"
		if [ $? -ne 0 ] ; then
			merr "granting privileges to database $1 failed!"
			exit 1
		fi
	fi

}

Am Mittwoch, 21. November 2018, 03:16:04 CET schrieb Jonathan Tyler:
> I just had the same thing happen to me. I installed Kamailio via Apt, and
> I'm using a dedicated MySQL server, with non-root admin credentials.
> Previously today I installed it using a local MySQL 5.7 database with no
> issues.
> 
> Kamailio Host: Kamailio 5.1.2 (Ubuntu 18.04)
> MySQL Host: MySQL 8.0.13 (Windows Server 2012 R2)
> 
> It creates the database, then fails at granting permissions. Accounts were
> created and privileges flushed before executing.
> > root at kamailio:~# kamdbctl create
> > INFO: creating database kamailio ...
> > mysql: [Warning] Using a password on the command line interface can be
> > insecure. INFO: granting privileges to database kamailio ...
> > mysql: [Warning] Using a password on the command line interface can be
> > insecure. ERROR 1064 (42000) at line 1: You have an error in your SQL
> > syntax; check the manual that corresponds to your MySQL server version
> > for the right syntax to use near 'IDENTIFIED BY '<password>'' at line 1
> I turned on query logging on the database host but didn't see any errors
> there, or in the error log itself.
> > 2018-11-21T01:58:15.045586Z 8 Connect <user>@kamailio on using SSL/TLS
> > 2018-11-21T01:58:15.046239Z 8 Query select @@version_comment limit 1
> > 2018-11-21T01:58:15.046764Z 8 Query CREATE DATABASE kamailio CHARACTER SET
> > utf8mb4 2018-11-21T01:58:15.189109Z 8 Quit
> > 2018-11-21T01:58:15.208476Z 9 Connect <user>@kamailio on using SSL/TLS
> > 2018-11-21T01:58:15.209019Z 9 Query select @@version_comment limit 1
> > 2018-11-21T01:58:15.210114Z 9 Quit
> 
> I've tried with the default MySQL 5.7 Client on Ubuntu, and upgrading it to
> 8.0.13, but got the same result.
> 
> Unfortunately I don't know how to see the output of the SQL Statement being
> sent (without installing 5.7), or I'd try to run it manually.

Hello Jonathan,

just an idea on how to debug this further:

Try to execute the kamdbctl with bash -x, like this "bash -x kamdbctl" (adding 
the correct path). Then it should print all the executed commands.

Best regards,

Henning


-- 
Henning Westerholt - https://skalatan.de/blog/
Kamailio services - https://skalatan.de/services
Kamailio security assessment - https://skalatan.de/de/assessment



More information about the sr-users mailing list