You can create a report that lists all users and their user roles without making any customizations. if you want to track when they received their user role and when a user role was removed, you will need to create an entity and associate it to the user role table to track this.
To show a list of users and user roles you can do something like this.
Hope this helps!
Edit: Here is one way to track when a user role is added or removed. I created an entity that looks like this.
It tracks the date and has an enumeration that says the user role was added or removed. The user role track object is associated to an account and a user role. So if a user role is added you would create one record, associate it to the account, and then associate it to the new user role (also set the date and the enum).
Then in your account edit page you can add this datagrid to see the history all the user roles the user had/has.
The list of users with their roles can easily be made. When assigned or removed not. You would have to create a logging system yourself. Create an entity where you store all those logs and attach this entity with a reference to the account object. Use an before commit on account so you can compare the current user roles with the ones you have in the before commit and base on that create your message to store in the logs.
Hope this helps,